我有一个在其构造函数中使用名称的模板类。该名称应该是实际类型的名称,以便可以将其放入人类可读的列表或其他内容中。
无论如何,我目前正在定义这样的类型:
typedef templateClass<someType> someTypeClass;
但是,为了使名称也成为“someTypeClass”,我需要用户始终正确指定该名称。相反,我想要某种方式来强制构造函数参数始终为“someTypeClass”(针对特定类型的特殊要求)。
name参数的目的是要有一种了解模板专业名称的方法。这是一个例子
template<class t>
class TemplateClass{
private:
std::string name;
t data;
public:
TemplateClass(const char* name);
/*Irrelevant*/
};
typedef TemplateClass<int> intType; //name should be "intType" but how can I force the name to be "intType" for this case? I dont want the user to have to type "intType" for every instance he wants to make
typedef TemplateClass<char> charType; //name should be "charType"
这是以某种可行的方式实现还是有更好的方法来解决?
最佳答案
您可以将名称设为静态,然后自己进行初始化。
template<class t>
class TemplateClass{
private:
static const std::string name;
t data;
public:
TemplateClass();
/*Irrelevant*/
}
typedef TemplateClass<int> intType;
template <>
const std::string TemplateClass<int>::name = "intType";
typedef TemplateClass<char> charType;
template <>
const std::string TemplateClass<char>::name = "charType";
请注意,通过这种方法,您可能希望将
std::string TemplateClass<int>::name;
放在标题中,并将初始化放在.cpp中使用和示例来澄清我的笔记
TemplateClass.hpp
#include <string>
template<class t>
class TemplateClass{
private:
static const std::string name;
t data;
public:
TemplateClass();
/*Irrelevant*/
}
typedef TemplateClass<int> intType;
template <>
const std::string TemplateClass<int>::name;
typedef TemplateClass<char> charType;
template <>
const std::string TemplateClass<char>::name;
TemplateClass.cpp
#include "TemplateClass.hpp"
template <>
const std::string TemplateClass<int>::name = "intType";
template <>
const std::string TemplateClass<char>::name = "charType";
在这里,我们在.hpp中声明了专门化变量,但仅在.cpp中对其进行了初始化。否则,它将在包含它的每个编译单元中进行初始化,并且会收到多个定义错误。
附加说明
如果您使用的是C++ 17,则可以使用新的
inline variable
并执行template <>
inline const std::string TemplateClass<int>::name = "intType";
无需在.cpp文件中添加任何内容。