![](/img/trans.png)
[英]Deduce types pack from a variadic-templated class and declare an argument of the same types pack
[英]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.