繁体   English   中英

以可变参数为模板的类:在没有专门针对整个类的情况下支持void?

[英]Variadic-templated class: support void without specializing the whole class?

我有一堂课:

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 而且我想避免专门化,即当我只有几个无效的不兼容方法时(例如,这里应使用0参数声明的invoke ,复制整个类。 我还有更多这样的类,所以我不喜欢将所有内容编写两次(并在两个位置进行编辑)。

我的一个想法是同时编写void和non-void invoke重载,并使用SFINAE禁用重载,但是我不知道如何实际实现这一点。

使用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 ...
};

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM