在现代C++;将字符串文本作为参数传递给C++;模板? 在“现代C++”(C++ 17或更大)中,将字符串文字作为参数传递给C++模板是可能的吗?

在现代C++;将字符串文本作为参数传递给C++;模板? 在“现代C++”(C++ 17或更大)中,将字符串文字作为参数传递给C++模板是可能的吗?,c++,c++17,c++20,boost,C++,C++17,C++20,Boost,我意识到你可以用构造函数参数来做这件事;我只是觉得将其作为模板参数比深入cpp文件更方便。我很好奇这是否是现代C++的一个新特性。请参阅下面的伪代码,了解我正在尝试执行的操作: 伪代码示例: // Header File ///////////////////////// template<constexpr string Name> class ModuleBase { public: ModuleBase(); string name; }; class xyz

我意识到你可以用构造函数参数来做这件事;我只是觉得将其作为模板参数比深入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() {

}
//头文件/////////////////////////
模板
类模块库{
公众:
ModuleBase();
字符串名;
};
类xyz:模块库{
公众:
xyz();
};
//Cpp文件//////////////////////////
模板
ModuleBase::ModuleBase(){
名称=名称;
}
xyz::xyz():ModuleBase(){
}
是,在中

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

添加
太空船操作员比较。如果它是非用户提供的(并且仅基于非用户提供的
,依次递归地重复)(和a),则该类型可以用作非类型模板参数

这些类型可以从
constexpr
构造函数中的原始
“strings”
构造,包括使用演绎指南使其自动调整大小

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


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

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

#define C_STR(str_) boost::mpl::c_str< BOOST_METAPARSE_STRING(str_) >::value
#定义C_STR(STR#)boost::mpl::C#u STR::value
然后按如下方式使用:

template<const char* str>
structe testit{
};
testit<C_STR("hello")> ti;
模板
结构测试{
};
睾丸ti;

FWIW,你不能将模板类的定义放在cpp文件中:@NathanOliver你可以,有很长的注释,我知道,但让OP阅读实际的解释,然后尝试在注释中对其进行总结要容易得多。@BillMoore问题不在于语法,而在于语义-模板定义(不仅仅是声明!)需要在使用端可见-所以你基本上必须像头一样使用它(或者只在本地使用)。这在EWG中是可以接受的,但在实际使用C++20之前,它仍然必须经过CWG(通常的警告是,C++20在完成之前不会执行)。然而,这看起来确实很有可能。我不合理地高兴
被广泛称为“宇宙飞船操作员”。@TiStrga甚至在介绍性论文中也将其命名为:皮尤pew@chris你已经过时了,它被CWG批准了,全体投票通过:)@Rakete1111否?“让一个非用户提供的运算符返回一个类型,该类型可以隐式转换为std::strong_equality,并且不包含引用。”--要求比
constepr
更严格,它是非用户递归提供的(即
constepr