【问题标题】:Can't define string literal in template arguments无法在模板参数中定义字符串文字
【发布时间】:2023-03-16 18:18:01
【问题描述】:

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

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% 是用户定义的示例。由于 % 终止符,它们可以任意长)

我怎样才能拥有我的蛋糕并且也吃它(或至少尽可能接近它)?

【问题讨论】:

  • 很快我们将能够在模板参数中包含字符串常量。在此之前,您的 const char* 必须是静态的或位于文件范围内。
  • 另一种方法是像您提到的那样传递一个字符数组或元组,尽管我认为还有其他 StackOverflow 答案可以这么说。

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


【解决方案1】:

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

在 我们将有推导指南,以及用户提供的类类型的非类型模板参数。而不是char const*,您将采用由"some string" 初始化的ct_string,它将包含其字符串数据并使用&lt;=&gt; 来确定唯一性。

在那之前你运气不好。

请注意,对于每个使用的缓冲区 msg,您会得到一个不同的 function&lt;msg&gt;(),而不是每个字符串值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-15
    • 1970-01-01
    • 1970-01-01
    • 2021-09-02
    • 2021-03-03
    相关资源
    最近更新 更多