【问题标题】:Example of a variadic templated method being inherited from a base class从基类继承的可变参数模板化方法的示例
【发布时间】:2014-08-15 16:22:29
【问题描述】:

我正在尝试将 C++11 的可变参数模板功能用于函数。基本上,我的要求是我有一个带有函数的基类,比如说,

user_defined_function()

这个函数不能在基类中定义,但是每当开发者创建一个派生类时,她可能想根据自己的需要实现这个方法。但是,该方法可以有任意数量的任意类型的参数,并且可以返回任意类型。我在想我可以将这个方法作为一个带有可变参数模板的方法,但是由于我正在处理方法的继承,我认为这很棘手。有人可以举一个这样做的例子吗?以下是我的代码,但我不确定这是否是正确的方法。

// base.h
class Base 
{
public: 
   template<typename R, typename... arguments>
   R user_defined_function(arguments... parameters);
};

// derived.h
class Derived:public Base
{
public:
  template<int, float, int, double>
  int user_defined_function(float, int, double);
};

// derived.cc
int Derived::user_defined_function(float, int, double)
{/* implementation */ }

【问题讨论】:

  • 基类不能定义为什么要在基类中声明?谁将调用该函数以及如何调用?也许看看 CRTP(“奇怪的重复模板模式”),它为基类提供了通过模板访问派生成员的权限。
  • 实际上基类定义了派生类的结构。它更像是一个界面。当有人从这个基类派生一个类时,他或她可能需要实现这个功能,这取决于他们的要求。我把它放在基类中的原因是让用户知道他或她可以在派生类中实现哪些功能。调用是在 Base 类中的另一个方法中完成的,我没有在上面显示。
  • 一个更完整的例子可能会有所帮助。尚不清楚模板扮演什么角色,或者您是否需要虚拟功能。但是,有一点是明确的,派生类不能专门化基类的成员模板。除了虚函数,C++ 目前还缺乏正式的接口规范。听起来您可能正在寻找类似于提议的“概念”功能的东西,该功能已至少推迟到 2017 年左右。同时,cmets 是最好的替代品。
  • 为什么说派生类不能特化基类的成员模板呢?粗略地说,我想在基类中有一个可以接受模板的虚函数。但这是不可能的。
  • 在我的情况下,如果我只是在派生类中重载 user_defined_function() 会更好吗?

标签: templates inheritance c++11 variadic-templates variadic-functions


【解决方案1】:

好的,我找到了解决问题的方法。问题出在我的设计上。我决定不要,

    user_defined_function()

在基类中。相反,我创建了另一个单例类,其中我有这个可变参数模板方法。然后我在上面描述的基类中实例化了这个类并将实例公开。现在,使用这个对象,我可以从所有派生类调用可变参数函数。它工作正常。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-12
    • 2019-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多