在“现代C++”(C17或更高版本)中是否可以将字符串作为参数传递给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条答案
按热度按时间ej83mcc01#
是的,在c++20中。
问题是确定模板非类型参数的唯一性很困难。
c++20添加
<=>
飞船运算符比较。如果它不是用户提供的(并且仅基于非用户提供的<=>
,依次递归重复)(并且是few other requirements; see p0732),则该类型可以用作非类型模板参数。此类类型可以在
constexpr
构造函数中从原始"strings"
构造,包括使用c++17推导指南使其自动调整大小。由于存储的数据大小可能是类型的一部分,因此您将希望将类型作为
auto
typed non-type parameter或其他自动推导的类型。注意,将模板的实现放在一个cpp文件中通常不是一个好主意,但这是另一个问题。
g6ll5ycj2#
在您获得c++20之前,如果您有boost,您可能会发现以下宏非常有用:
然后按如下方式使用:
zqdjd7g93#
这比直接传递一个字符串常量更难看,但在C++20中,也可以使用NTTP constexpr lambda返回字符串:
编译器资源管理器示例here。
ryoqjall4#
这可以在C++17中实现,但是在传递name之前,需要为C字符串提供
static constexpr
存储空间:https://godbolt.org/z/ojnv8xPca