gpt4 book ai didi

c++ - 可变模板类 : support void without specializing the whole class?

转载 作者:行者123 更新时间:2023-11-30 03:58:10 25 4
gpt4 key购买 nike

我有一个类:

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没有争论。我想避免特化,我。 e.复制整个类,当我只有几个 void-incompatible 方法时(比如这里的 invoke 应该用 0 个参数声明)。我还有几个这样的类(class),所以我讨厌将所有内容都写两次(并在两个地方进行编辑)。

我的一个想法是同时写 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 ...
};

关于c++ - 可变模板类 : support void without specializing the whole class?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27582557/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com