【问题标题】:Is it possible in modern C++ to pass a string literal as a parameter to a C++ template?在现代 C++ 中是否可以将字符串文字作为参数传递给 C++ 模板?
【发布时间】:2018-12-14 04:19:37
【问题描述】:

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

}

【问题讨论】:

  • FWIW,您不能将模板类的定义放在 cpp 文件中:stackoverflow.com/questions/495021/…
  • @NathanOliver 你可以,但有很长的警告
  • 是的,我知道,但是让 OP 阅读实际解释然后尝试在评论中总结所有内容要容易得多..
  • @BillMoore 问题不在于语法,问题在于语义——模板定义(不仅仅是声明!)需要在使用端可见——所以无论如何,您基本上都必须像标题一样使用它(或者仅在本地使用它)。

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


【解决方案1】:

是的,在

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

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

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

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


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

【讨论】:

  • 这在 EWG 中已被接受,但 AFAIK,它仍然必须通过 CWG,然后才能真正在 C++20 中(通常需要注意的是 C++20 在完成之前不会完成)。然而,它确实看起来很有可能。
  • 我非常高兴&lt;=&gt; 被广泛称为“宇宙飞船操作员”。
  • @TiStrga 甚至在介绍性论文中都被命名为:open-std.org/JTC1/SC22/WG21/docs/papers/2017/p0515r0.pdfpew pew
  • @chris 你已经过时了,它已被 CWG 批准并在全体会议上投票:)
  • @Rakete1111 没有? “有一个非用户提供的 operator 返回一个可隐式转换为 std::strong_equality 的类型,并且不包含任何引用。” -- 要求强于constexpr,非用户递归提供(即constexpr
【解决方案2】:

直到您获得 并且如果您拥有,您可能会发现以下宏很有用:

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

然后按如下方式使用:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-03
    • 2021-09-02
    • 2014-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-05
    • 2014-03-19
    相关资源
    最近更新 更多