无法在模板参数中定义字符串文字

时间:2018-10-01 01:31:47

标签: c++ templates syntax template-meta-programming

我正在尝试在函数的模板参数中定义新的字符串文字。

template<const char* msg>
const char* function()
{
    return msg;
}
int main()
{
    function<"why doesnt this work?">()
    return 0;
}

但是,它不起作用。我必须要做类似的事情

constexpr char msg[] = "this is ugly and annoying";
int main()
{
    function<msg>()
    return 0;
}

这非常不方便。我正在尝试创建类似printf的函数,但这是一个主要障碍。如果我使用伪造的字符串(例如tuple('a','b','c'...),那么扩展用户定义格式的接口以及一般代码将变得更加困难和丑陋。 (%d%,%f%,%e%是默认格式,%myformat%是用户定义的示例。由于%终止符,它们的长度可以任意设置)

我怎么也可以吃蛋糕(或至少尽可能靠近蛋糕)?

1 个答案:

答案 0 :(得分:1)

C ++标准不允许这样做,因为编译器在“折叠”相同字符串的规则的工作原理上存在问题。

中,我们将提供推论指南以及用户验证的类类型的非类型模板参数。代替char const*,您将使用ct_string初始化的"some string",它将包含其字符串数据并使用<=>来确定唯一性。

直到你不走运。

请注意,对于使用的每个缓冲区function<msg>(),而不是每个字符串值,您都会得到一个不同的msg