c++ - 这个可变参数模板示例有什么问题?

标签 c++ c++11 variadic-templates

基类是:

#include <memory>

namespace cb{

template< typename R, typename ... Args >
class CallbackBase
{
public:
    typedef std::shared_ptr< CallbackBase< R, Args... > >
            CallbackPtr;

    virtual ~CallbackBase()
    {
    }
    virtual R Call(  Args ... args) = 0;
};
} // namespace cb

派生类是这样的:

namespace cb{
template< typename R, typename ... Args >
class FunctionCallback : public CallbackBase< R, Args... >
{
public:
    typedef R (*funccb)(Args...);

    FunctionCallback( funccb cb_ ) : 
        CallbackBase< R, Args... >(),
        cb( cb_ )
    {
    }
    virtual ~FunctionCallback()
    {
    }
    virtual R Call(Args... args)
    {
      return cb( args... );
    }
private:
  funccb cb;
};
} // namespace cb

创建函数:

namespace cb{
template < typename R, typename ...Args >
typename CallbackBase< R, Args... >::CallbackBasePtr
    MakeCallback( typename FunctionCallback< R, Args... >::funccb cb )
{
    typename CallbackBase< R, Args... >::CallbackBasePtr
        p( new FunctionCallback< R, Args... >( cb )
);
    return p;
}
} // namespace cb

例子:

bool Foo_1args( const int & t)
{
    return true;
}
int main()
{
    auto cbObj = cb::MakeCallback( & Foo_1args );
}

我一直收到这个错误:

error: no matching function for call to ‘MakeCallback(bool (*)(const int&))’
error: unable to deduce ‘auto’ from ‘<expression error>’

我试图更改它,但我不知道如何修复。

那么,有什么问题吗?以及如何修复此示例?

最佳答案

这个问题用一个更简单的例子可能更有意义。尝试在此处确定问题:

template <typename T>
struct id { typedef T type; };

template <typename T>
void foo(typename id<T>::type x);

foo(5); // error

问题是编译器无法推断出什么 T应该;它没有直接在任何地方使用。您必须明确提供它:foo<int>(5) ,或者让它以其他方式推导它:

template <typename T>
void foo(typename id<T>::type x, T y);

foo(5, 7); // okay, T is int because 7 is int

这是有道理的:编译器怎么能找出哪个T的,提供给 id , 结果为 id<T>::type匹配?可能会有特化,如果可能的话,整个事情无论如何都会很昂贵。


同样,编译器无法推断出R。和 Args .相反,您应该这样做:

template < typename R, typename ...Args >
typename CallbackBase< R, Args... >::CallbackBasePtr
    MakeCallback( R cb(Args...) )
{
    typename CallbackBase< R, Args... >::CallbackBasePtr
        p( new FunctionCallback< R, Args... >( cb ));

    return p;
}

最后,您还有其他需要修复的小问题,which Xeo has outlined .

关于c++ - 这个可变参数模板示例有什么问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5656691/

相关文章:

c++ - 如何在修改容器时正确迭代容器?

c++ - 将函数递归映射到 vector

c++ - 匿名 union 和结构

c++ - 在Arduino的C++中使用可变参数模板编写自定义[s] printf

c++ - 如何打印任意数量或随机访问的容器?

c++ - GDB 在核心文件上使用 "symbol-file"命令读取符号

c++ - 我可以明确地专门化 std:shared_ptr::operator ->

c++11 - C++ 为什么在 move 构造函数和 move 赋值运算符的上下文中需要 noexcept 来启用优化?

c++ - 从派生的可变参数模板类调用基模板的虚方法

c++ - CreateComputeShader 在使用 double 时返回 E_INVALIDARG