我有一个在其构造函数中使用名称的模板类。该名称应该是实际类型的名称,以便可以将其放入人类可读的列表或其他内容中。

无论如何,我目前正在定义这样的类型:

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文件中添加任何内容。

09-04 16:12