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

标签 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() {

}

最佳答案

是的,在 .

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

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

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

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


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

关于c++ - 在现代 C++ 中是否可以将字符串文字作为参数传递给 C++ 模板?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51195445/

相关文章:

c++ - 如何使用 C++20 std::format?

c++ - 读取表示整数的 6 字节大端二进制字段

c++ - 如何从 vector 中的指向对象的指针列表中调用对象方法?

c++ - VS2017 是否完全支持折叠表达式?

c++17 通过生成预先声明的类型列表的笛卡尔积来制作 std::variant

c++ - 在 C++20 中增加一个 volatile 并弃用对 volatile 的操作

c++ - 在容器 : hardcode the container type, 上运行的方法还是使用通用模板迭代器?

c++ - 在c/c++中初始化未知大小的数组

c++ - 如何在我的主应用程序中加载一个 dll 会导致 100 个 CPU 负载?

c++ - 如何通过可变参数模板表达概念?