嗨,我试图在 C++11 中实现一个类似于 C++ 概念的功能(C++14)。这个想法只是为std::for_each()
算法编写包装函数,我只是检查第三个参数是否是函数。所以我编写了以下代码,但是我无法按应有的方式编译它。我正在使用带有 gcc4.8.1 的 Ubuntu12.04。
test_1.cpp
#include<type_traits>
#include<iostream>
#include<vector>
#include<algorithm>
void display(int& val) {
std::cout <<val<<std::endl;
}
template<typename T>
constexpr bool Is_valid_function(T& a) {
return std::is_function<T>::value;
}
template<typename T>
void check_valid_function(T& a) {
static_assert(Is_valid_function(a), "Not The Valid Function");
}
template <class InputIterator, class Function>
Function my_for_each(InputIterator first, InputIterator last, Function f) {
/* Concept Like Implementation to just check whether f is function or not */
check_valid_function(f);
return for_each(first, last, f) ;
}
void learn_static_assert_and_typetraits(void)
{
std::vector<int> vec_x{1,2,3,4,5};
my_for_each(vec_x.begin(), vec_x.end(), display);
}
int main(int argc, const char* argv[]) {
learn_static_assert_and_typetraits();
return 0;
}
我收到以下编译错误,从中可以看出失败与有效功能static_assert()
不正确。display
编译错误
test_3.cpp:在 'void check_valid_function(T&) [with T = void (*)(int&)]' 的实例化中: test_3.cpp:27:26: 'Function my_for_each(InputIterator, InputIterator, Function) [with InputIterator = __gnu_cxx::__normal_iterator >; 函数 = 无效 (*)(int&)]' test_3.cpp:35:50:从这里需要 test_3.cpp:19:3: 错误:静态断言失败:不是有效函数 static_assert(Is_valid_function(a), "不是有效函数"); ^
但是,如果我对其他 type_traits 函数做同样的事情,我会得到以下正确且预期的错误。
test_2.cpp
#include<type_traits>
template<typename T>
constexpr bool Is_floating_point(T& a) {
return std::is_floating_point<T>::value;
}
template<typename T>
void f(T& a) {
static_assert(Is_floating_point(a), "Non-Float Type Data");
}
void learn_static_assert_and_typetraits(void) {
float y{10.0};
f(y);
int x{100};
f(x);
}
int main(int argc, const char* argv[]) {
learn_static_assert_and_typetraits();
return 0;
}
编译器输出
test_2.cpp:在 'void f(T&) [with T = int]' 的实例化中: test_2.cpp:19:6: 从这里需要 test_2.cpp:11:3:错误:静态断言失败:非浮点类型数据 static_assert(Is_floating_point(a), "非浮点型数据"); ^
问题
所以,我想了解为什么我的第一个程序不能正常工作,我的代码/理解中是否存在错误或者是其他问题。我希望以上数据足以理解我的问题。但是,如果有人想要一些额外的数据,请告诉我。