带有typedef多参数的c ++模板?

时间:2017-03-15 09:07:15

标签: c++ templates

我有一个带有5个模板参数的模板类,看起来与此类似。

SomeClass.h

template < typename A, typename B, typename C, typename D >
class SomeClass
{
private:
A a_obj;
B b_obj;
C c_obj;
D d_obj;
public:
void someoperationA();
void someoperationB();
void someoperationC();
};

SomeClass.cpp

template < typename A, typename B, typename C, typename D >
SomeClass<A, B, C, D>::someoperationA()
{
 A::someStaticMethods();
}

template < typename A, typename B, typename C, typename D >
SomeClass<A, B, C, D>::someoperationB()
{}

template < typename A, typename B, typename C, typename D >
SomeClass<A, B, C, D>::someoperationC()
{}

考虑一下我的模板参数应该被赋予一些好名字的情况,比如

SomeClass.cpp

template < 
typename ABIGCLASSNAME, 
typename BBIGCLASSNAME, 
typename CBIGCLASSNAME, 
typename DBIGCLASSNAME 
>
SomeClass<ABIGCLASSNAME, 
BBIGCLASSNAME, 
CBIGCLASSNAME, 
DBIGCLASSNAME>::someoperationA()
{
ABIGCLASSNAME::someStaticMethods();
}

绝对看起来很难看:(

因此可以以任何方式输入模板参数,以便其可读......类似于

typedef template < typename ABIGCLASSNAME, typename BBIGCLASSNAME, typename CBIGCLASSNAME, typename DBIGCLASSNAME > TEMP_WITH_PARAMS

除了使用#define

之外,还有类似于的类似内容

3 个答案:

答案 0 :(得分:2)

不,没有

请注意,您不能在源(.cpp)文件中使用模板化定义。见Why can templates only be implemented in the header file?

有人提议定义一个类名称空间,其中所有定义都被认为是该类的成员,这可以解决您的问题,但它并没有太大的吸引力。

因此要么编写所有模板参数(但在标题中),要么在类中定义它们。我个人更喜欢在类中定义方法,因为无论如何我必须在头文件中定义,我没有看到在类之外定义它们的优点与编写代码两次的麻烦。

您可以做的另一个技巧是拥有非常短的模板参数名称,并在类中具有全名别名。 E.g:

template <class F> struct S {
   using Function = F;
};

答案 1 :(得分:2)

考虑创建一个包含所有必需参数的包装器struct,然后对其进行模板化SomeClass

template < typename A, typename B, typename C, typename D >
struct Settings
{
    using AType = A;
    using BType = B;
    using CType = C;
    using DType = D;
};

template < typename TSettings >
class SomeClass { /* ... */ } 

template < typename TSettings >
SomeClass<TSettings>::someoperationB() { /* ... */ }

优点:

  • 更少的样板。

  • 如果您决定添加新模板参数或更改现有参数,则只需更改Settings

使用类型特征保留原始界面也很简单:

template < typename A, typename B, typename C, typename D >
using SomeClass = SomeClassImpl<Settings<A, B, C, D>>;

考虑使用可变参数类型特征以避免重复A, B, C, D

template < typename... Ts >
using SomeClass = SomeClassImpl<Settings<Ts...>>;

答案 2 :(得分:0)

描述性模板参数的名称很好。但是一旦你最初指定它们,你就不必拖动它们了。有两件事可以帮到你:

  1. using在课堂上有一个简短的别名。
  2. 您不必为类外的定义使用模板参数的相同名称。

    #include <iostream>
    template <typename SomeLongAndUglyName>
    class ImPretty {
      public: 
        using SimplyUgly = SomeLongAndUglyName;
    
      void foo();
    };
    
    template <typename Ugly>
    void ImPretty<Ugly>::foo() {
      std::cout << "pretty" << std::endl;
    }