gpt4 book ai didi

c++ - 在类模板中使用条件运算符初始化静态 constexpr char 数组成员

转载 作者:行者123 更新时间:2023-11-27 22:37:05 24 4
gpt4 key购买 nike

考虑一个最小的例子

#include <iostream>

template<typename T>
struct foo
{
// won't compile. how to change?
static constexpr char sep[3] = std::is_integral<T>::value ? ". " : ", ";

// many other things ...
};

int main()
{
std::cout << foo<int>::sep << std::endl; // prints .
std::cout << foo<double>::sep << std::endl; // prints ,
}

我想实现的是:

  • 如果T有一个整数类型,那么sep被初始化为
  • 否则,sep被初始化为,

然而,编译器不允许这样做,说

error: array must be initialized with a brace-enclosed initializer

看起来有些事情必须在编译时完成。但我不确定该怎么做。

我的问题是:我能做些什么来实现这一目标?

注意:欢迎进行最小的更改。 foo 中应该还有很多其他的东西。另一个考虑因素是,如果可能的话,我想将有关 foo 的所有内容都保留在 header 中,并且不在源文件中保留任何内容。

非常感谢。

最佳答案

C 数组不可复制,因此您必须解决这个问题

  • 检查每个字符:

    constexpr char sep[3] = { std::is_integral<T>::value ? '.' : ',', ' ', '\0' };
  • 不要使用数组,而是使用指针(这样就可以减少大小):

    constexpr const char* sep = std::is_integral<T>::value ? ". " : ", ";
  • 使用std::array:

    constexpr std::array<char, 3> sep = std::is_integral<T>::value
    ? std::array<char, 3>{{'.', ' ', 0}}
    : std::array<char, 3>{{',', ' ', 0}};
  • 使用对数组的引用:

    constexpr char dot_sep[3] = std::is_integral<T>::value ? ". " : ", ";
    constexpr char comma_sep[3] = std::is_integral<T>::value ? ". " : ", ";
    constexpr const char (&sep)[3] = std::is_integral<T>::value ? dot_sep : comma_sep;

    并提供 ODR 使用的 dot_sep/comma_sep 的定义。

关于c++ - 在类模板中使用条件运算符初始化静态 constexpr char 数组成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52916221/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com