【发布时间】:2020-02-06 22:01:36
【问题描述】:
我将继承与一组类一起使用。其中一个子类接受std::function(ReturnTy<ParamTypes...>) 以及ParamTypes 参数。类签名和构造函数如下所示:
template<class ReturnTy, class... ParamTypes>
class Child : public Interface
{
public:
Child(ReturnTy default_value, ParamTypes... args)
: func_set_(false)
, m_Args(std::make_tuple(std::forward<ParamTypes>(args)...))
, m_ReturnValue(default_value)
{}
private:
bool func_set_;
std::function<ReturnTy(ParamTypes...)> m_Funciton;
std::tuple<ParamTypes...> m_Args;
ReturnTy m_ReturnValue;
};
我的问题是当我想专门针对没有参数的情况。此外,我还想专门针对ReturnTy=void 并且有参数的情况。我找到了一个接近我正在寻找的答案here,但它并没有完全涵盖我正在尝试做的事情,因为该问题使用编译时整数作为模板参数,而我正在使用类型.它还涉及函数而不是类。我觉得我很接近了,但我只需要一些帮助来让我的代码正常工作。
作为参考,以下是我对其他专业的了解(缩短):
template<class ReturnTy>
class Child<ReturnTy> : public Interface
{
public:
Child(ReturnTy default_value)
: // The same as first class without m_Args
{}
private:
// Same as first class without m_Args
};
template<class... ParamTypes>
class Child<void, ParamTypes...> : public Interface
{
public:
Child(ParamTypes... args)
: // Same as first class without m_ReturnValue
private:
// Same as first class without m_ReturnValue
};
编辑
具体来说,问题来自类似以下代码行:
Child<void> obj1(5);
【问题讨论】:
-
大家都知道,我已经从类中省略了与我的问题无关的方法。例如,有一个
set_function()方法将初始化std::function,还有一个来自接口的虚拟run()函数执行m_ReturnValue = std::apply(m_Function, m_Args)。 -
如果是
Child<void>,应该选择哪个专业?仅带有ReturnTy的那个还是带有void的那个? -
@max66 我想要只选择
void,但我不知道如何告诉编译器选择那个。 -
对不起:我不清楚:你的意思是最后一个:
class Child<void, ParamTypes...>?
标签: c++ class templates variadic-templates template-specialization