不完整类型提升的无效使用 function_traits
invalid use of incomplete type boost function_traits
我试图让下面的东西工作但编译失败。
// T is a function with a callback, std::function<void(std::function<void (DataType)> >
struct doFunc {
template<typename T>
void operator()(T && func) {
auto callback = [](typename function_traits<typename function_traits<T>::arg1_type >::arg1_type r) {
std::cout << r;
};
func(callback);
}
};
// usage
doFunc()([](std::function<void(string)> cb){
cb("hello");
});
错误是:
invalid use of incomplete type 'struct boost::detail::function_traits_helper<SomeClass::TestBody()::<lambda(std::function<void(std::__cxx11::basic_string<char>)>)>*>'
这是因为编译器无法将类型推导出来吗?如果我想保持这样的用法,如何解决?
编辑
我在没有 boost::function_traits 的情况下实现了类似的东西,但仍然存在编译错误。
template <typename T>
struct SimpleTraits;
template <typename R>
struct SimpleTraits<std::function<void(R)>> {
typedef R ARG_TYPE;
};
static_assert(std::is_same<SimpleTraits<std::function<void(int)>>::ARG_TYPE, int>::value, "int and int is same type");
static_assert(!std::is_same<SimpleTraits<std::function<void(int)>>::ARG_TYPE, std::string>::value, "int and string is not");
struct doFunc {
template<typename T>
void operator()(T && func) {
typename SimpleTraits<T>::ARG_TYPE empty();
func(empty);
}
};
doFunc()([](int a){
cout << a;
});
错误依旧
error: invalid use of incomplete type
知道为什么这仍然是错误的吗?
ℹ Tip:
function_traits
is intended to introspect only C++ functions of the form R ()
, R( A1 )
, R ( A1, ... etc. )
and not function pointers or class member functions. To convert a function pointer type to a suitable type use remove_pointer.
因此,它没有为其他类型(例如像 std::function<>
这样的复合函数对象)实现很有意义
我试图让下面的东西工作但编译失败。
// T is a function with a callback, std::function<void(std::function<void (DataType)> >
struct doFunc {
template<typename T>
void operator()(T && func) {
auto callback = [](typename function_traits<typename function_traits<T>::arg1_type >::arg1_type r) {
std::cout << r;
};
func(callback);
}
};
// usage
doFunc()([](std::function<void(string)> cb){
cb("hello");
});
错误是:
invalid use of incomplete type 'struct boost::detail::function_traits_helper<SomeClass::TestBody()::<lambda(std::function<void(std::__cxx11::basic_string<char>)>)>*>'
这是因为编译器无法将类型推导出来吗?如果我想保持这样的用法,如何解决?
编辑
我在没有 boost::function_traits 的情况下实现了类似的东西,但仍然存在编译错误。
template <typename T>
struct SimpleTraits;
template <typename R>
struct SimpleTraits<std::function<void(R)>> {
typedef R ARG_TYPE;
};
static_assert(std::is_same<SimpleTraits<std::function<void(int)>>::ARG_TYPE, int>::value, "int and int is same type");
static_assert(!std::is_same<SimpleTraits<std::function<void(int)>>::ARG_TYPE, std::string>::value, "int and string is not");
struct doFunc {
template<typename T>
void operator()(T && func) {
typename SimpleTraits<T>::ARG_TYPE empty();
func(empty);
}
};
doFunc()([](int a){
cout << a;
});
错误依旧
error: invalid use of incomplete type
知道为什么这仍然是错误的吗?
ℹ Tip:
function_traits
is intended to introspect only C++ functions of the formR ()
,R( A1 )
,R ( A1, ... etc. )
and not function pointers or class member functions. To convert a function pointer type to a suitable type use remove_pointer.
因此,它没有为其他类型(例如像 std::function<>
这样的复合函数对象)实现很有意义