我有一个带有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
之外,还有类似于的类似内容答案 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)
描述性模板参数的名称很好。但是一旦你最初指定它们,你就不必拖动它们了。有两件事可以帮到你:
using
在课堂上有一个简短的别名。您不必为类外的定义使用模板参数的相同名称。
#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;
}