无效使用不完整的类型boost function_traits

invalid use of incomplete type boost function_traits

本文关键字:boost function traits 类型 用不完 无效      更新时间:2023-10-16

我试图使以下事情工作,但它无法编译。

// 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

知道为什么这仍然是错误的吗?

From docs: http://www.boost.org/doc/libs/1_59_0/libs/type_traits/doc/html/boost_typetraits/reference/function_traits.html

提示:

function_traits只内省R ()R( A1 )R ( A1, ... etc. ) 形式的c++函数,不内省函数指针或类成员函数。要将函数指针类型转换为合适的类型,请使用remove_pointer。

因此,对于其他类型(如std::function<>等复合函数对象)没有实现是很有意义的