在现代C ++中,是否可以将字符串文字作为参数传递给C ++模板?

时间:2018-07-05 15:47:11

标签: c++ c++17 c++20

在“现代C ++”(C ++ 17或更高版本)中是否可以将字符串文字作为参数传递给C ++模板?

我意识到您可以使用构造函数参数来实现;我只是认为将其作为模板参数比将其深埋在cpp文件中更为方便。我很好奇这是否是现代C ++的新功能。请参阅下面我想做的伪代码:

伪代码示例:

// Header File /////////////////////////
template<constexpr string Name>
class ModuleBase {
public:
    ModuleBase();
    string name;
};

class xyz : ModuleBase<"xyz"> {
public:
    xyz();
};

// Cpp File //////////////////////////
template<string_literal Name>
ModuleBase<Name>::ModuleBase() {
    name = Name;
}

xyz::xyz() : ModuleBase() {

}

2 个答案:

答案 0 :(得分:54)

是,在中。

问题在于确定模板非类型参数的唯一性很困难。

添加了<=>太空飞船操作员比较。如果它是非用户提供的(并且仅基于非用户提供的<=>,则递归重复)(和few other requirements; see p0732),则该类型可以用作非类型模板参数。

可以从"strings"构造函数中的原始constexpr构造此类类型,包括使用推导指南使它们自己自动调整大小。

由于存储的数据大小可能是该类型的一部分,因此您需要将该类型作为auto typed non-type parameter或自动推断的类型。


请注意,将模板的实现放在cpp文件中通常是一个坏主意。但这是另一个问题。

答案 1 :(得分:0)

在获得之前,如果您拥有,则可能会发现以下宏有用:

#define C_STR(str_) boost::mpl::c_str< BOOST_METAPARSE_STRING(str_) >::value

然后使用如下:

template<const char* str>
structe testit{
};
testit<C_STR("hello")> ti;