我有一个班级:
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,但我不知道如何实际实现它。
答案 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 ...
};