Variadic-template类:支持void而不专门化整个类?

时间:2014-12-20 17:24:29

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

我有一个班级:

template <typename ...Arguments>
class CSignalConnection
{
public:
    CSignalConnection(std::function<void(Arguments...)> target) : m_target(target) {}

    void invoke(Arguments&&... args) const
    {
        m_target(std::forward<Arguments>(args)...);
    }

private:
    std::function<void(Arguments...)> m_target;
};

我希望能够声明CSignalConnection<void>并在没有参数的情况下调用invoke。我想避免专业化,我。即复制整个类,当我只有一些与void不兼容的方法时(比如invoke这里应该用0参数声明)。我有更多这样的课程,所以我讨厌写两次(并在两个地方编辑)。

我的一个想法是写出无效和非空invoke重载并禁用SFINAE,但我不知道如何实际实现它。

1 个答案:

答案 0 :(得分:2)

使用CSignalConnection<>会使Arguments包空。以下适用于我

void f() {
    std::cout << "hello world\n";
}

int main () {    {
    CSignalConnection<> cs{&f};
    cs.invoke();
} 

但是,由于您没有类型扣除这是滥用转发,您需要使invoke()推断其参数的类型以获得真正的通用引用(转发引用)

template <typename ...Arguments>
class CSignalConnection {
  public:
    template <typename... Ts>
    void invoke(Ts&&... args) const
    {
        m_target(std::forward<Ts>(args)...);
    }
    //... rest of the class omitted ...
};