模板中的函数类型无法编译

H X*_* Xu 5 c++ templates c++11

我正在使用gcc 4.6.1使用可变参数模板参数.以下代码按预期编译:

template<typename RetType, typename... ArgTypes>
class Event;

template<typename RetType, typename... ArgTypes>
class Event<RetType(ArgTypes...)>
{
public:
    typedef function<RetType(ArgTypes...)> CallbackType;

    void emit(ArgTypes...args)
    {
        for (CallbackType callback : callbacks)
        {
            callback(args...);
        }
    }

private:
    vector<CallbackType> callbacks;
};
Run Code Online (Sandbox Code Playgroud)

但令我惊讶的是,下面只有一个"Argument Type"的"普通"版本无法编译:

template<typename RetType, typename ArgType>
class Event;

template<typename RetType, typename ArgType>
class Event<RetType(ArgType)> // <- error: wrong number of template arguments (1, should be 2)
{};
Run Code Online (Sandbox Code Playgroud)

g ++ 4.6.1在注释中给出了错误.

任何人都知道它为什么会导致错误以及如何使其工作?另外,我认为上面的代码是"模板部分专业化"的一种形式吗?

Xeo*_*Xeo 5

如果你想制作自己的版本以std::function获得乐趣,它应该如下所示:

template<class Signature>
class Event;

template<class R, class... Args>
class Event<R(Args...)>{
  // ...
};
Run Code Online (Sandbox Code Playgroud)

@ronag已经解释了为什么第一个版本有效,参数包(...在模板参数中)表示或更多.如果你想要一个std::/ 类似boost::function的类(这int(int, double, char)是一个函数类型,这就是为什么它可以适合单个类型的声明class Signature),我上面给出的代码仍然是正确的签名.


ron*_*nag 4

template<typename RetType, typename ArgType>
class Event;
Run Code Online (Sandbox Code Playgroud)

需要 2 个模板参数,RetType并且ArgType,您只给它一个RetType(ArgType)

template<typename RetType, typename... ArgType>
class Event;
Run Code Online (Sandbox Code Playgroud)

需要 1 个或多个模板参数RetType可选 ArgTypes。