【问题标题】:Extract type from variadic template class for member function overloading从可变参数模板类中提取类型以进行成员函数重载
【发布时间】:2020-12-16 13:57:00
【问题描述】:

我想为每种类型的可变参数模板类创建一个函数重载。这可能吗?

template<typename ...args>
class Example {
    virtual void doSomething(args(0) arg) { ... } 
    virtual void doSomething(args(1) arg) { ... }
    /// etc... implementations are the same, but I need access to the type
}

我尝试使用折叠表达式,但我很确定我没有走在正确的轨道上。因为我需要函数是虚拟的,所以我不能将它们声明为 template&lt;typename T&gt; virtual void doSomething(T arg),因为模板虚拟函数是不允许的。

【问题讨论】:

  • 但是模板的想法是让用户决定他将要实例化类的类型,所以在编写可变参数模板时,你不知道会有多少参数.在编写代码时,您如何知道必须提供多少重载?如果实现相同,则不应将其设为可变参数模板。考虑到实现是相同的,只需一个普通的 template&lt;typename T&gt; 和一个函数 virtual void doSomething(T arg) { ... } 就可以了。
  • 你能给我们一个更详细的例子来说明你试图实现的目标吗? Example 层次结构的示例、doSomething 内部内容的伪代码以及使用层次结构的用例。
  • 嗨。我的回答能满足你的问题吗?如果是,请接受。如果没有,请告诉我(当然是在那个答案下)你对解决方案还有什么期望,我错过了。

标签: c++ templates types overloading variadic-templates


【解决方案1】:

您可以从基类模板的一组实例化模板中派生该类,该模板定义了一个虚函数,其单个模板参数作为函数参数类型。 然后派生类保存每个模板参数类型的函数重载,它们都是虚拟的。

template<typename arg>
class Base {
    virtual void doSomething(arg arg) {}
};

template<typename ...args>
class Example : public Base<args>... {};

【讨论】:

    猜你喜欢
    • 2013-01-24
    • 1970-01-01
    • 2011-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多