【问题标题】:Template class generic specialization in separate cpp-file: many template arguments单独的 cpp 文件中的模板类通用特化:许多模板参数
【发布时间】:2017-03-24 15:29:48
【问题描述】:

假设在 .h 文件中我有一个模板类声明:

template<typename T1, 
         typename T2, 
         typename T3,
         typename T4>
class A {
public:
  A();
  ~A();

  void method1();
  void method2();

  ...
}

模板参数的数量自此 API 起会发生变化 仍然没有修复。我更喜欢在单独的 .cpp 文件中实现通用专业化。据我了解,有人可能会写(例如,对于 ctor):

template<typename T1, 
         typename T2, 
         typename T3,
         typename T4>
A<T1, T2, T3, T4>::A() {
   ...
}

对于每个 A 类方法等等……使用笨重的构造让我很恼火:

template<typename T1, 
         typename T2, 
         typename T3,
         typename T4>
A<T1, T2, T3, T4>::

每次我实现 A 类方法时。增删时 一个或几个模板参数将是一个大问题。 我可以使用一些 C++ 语言功能(最高 C++11)来避免这种情况吗?早期我看到了一个预处理器宏来执行此操作,但我认为它很难看:)

【问题讨论】:

  • I prefer to implement a generic specialization in separated .cpp file - 你的模板的用户还必须看到这个特化才能使模板实例化成为可能,所以除非你准备好在这个 .cpp 中显式实例化 A 的版本,你也可以把.h 文件中的这个实现。
  • 可以使用 c++11 中的可变参数模板。检查eli.thegreenplace.net/2014/variadic-templates-in-c

标签: c++ c++11 templates


【解决方案1】:

也许您可以创建一个中间类来保存模板参数。像这样。

啊。 模板 类模板参数 { 使用 T1_S = T1; 使用 T2_S = T2; 使用 T3_S = T3; 使用 T4_S = T4;
};

template<typename TemplateParams>
class A_Base {
public:
  A_Base();
  ~A_Base();

  void method1();
  void method2();
};

template<typename T1, 
         typename T2, 
         typename T3,
         typename T4>
using A = A_Base<TemplateParams<T1,T2,T3,T4>>;

#include "A_impl.h"

A_impl.h

   template<typename TemplateParams>
   A_Base<TemplateParams>::A_Base() {}

   template<typename TemplateParams>
   A_Base<TemplateParams>::~A_Base() {}


    template<typename TemplateParams>
    void A_Base<TemplateParams>::method1() {

    }

使用方式没有变化

#include "A.h"
A<int,int,int,int> a;
a.method1();

【讨论】:

    猜你喜欢
    • 2022-01-03
    • 2011-05-10
    • 2018-11-26
    • 1970-01-01
    • 2018-06-25
    • 2022-06-18
    • 1970-01-01
    • 2015-02-19
    • 1970-01-01
    相关资源
    最近更新 更多