52

是否可以在“现代 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() {

}
4

2 回答 2

57

是的,在中。

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

增加了一个<=>宇宙飞船操作符比较。如果它是非用户提供的(并且仅基于非用户提供<=>的轮流,递归地重复)(以及一些其他要求;参见 p0732),该类型可以用作非类型模板参数。

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

由于存储的数据的大小可能会成为类型的一部分,因此您需要将该类型作为auto类型化的非类型参数或其他自动推导的类型。


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

于 2018-07-05T15:50:22.193 回答
1

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

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

然后使用如下:

template<const char* str>
structe testit{
};
testit<C_STR("hello")> ti;
于 2019-01-17T10:28:36.387 回答