我正在尝试在类static constexpr std::vector
中初始化std::string
个Foo
中的一个class Foo {
public:
static constexpr std::vector<std::string> a = {"a", "bc", "232"}; // not working, constexpr variable not literal ....
const std::vector<std::string> a = {"a", "bc", "232"}; // this works
}
。稍后我将使用其元素的地址。
...hello world.bye
使用c ++ 11,谢谢。
答案 0 :(得分:2)
我可以使用const而不是constexpr。但是没有办法做到这一点有点奇怪
可以和const
一起生活很好,但是,只是为了好玩,我向您展示了一种方法,可以使使用{{1} }代替constexpr
,并再次使用static
代替std::array
。
不幸的是,您使用的是C ++ 11,所以没有std::vector
/ std::array
(从C ++ 14开始可用),但是我在下面的完整示例中添加了C ++ 11替代品。
如果您知道要在std::string
成员中使用的字符串长度的上限,例如9(在您的示例中为3),则可以按以下方式定义std::index_sequence
类型>
std::make_index_sequence
请注意,constexpr
的大小是最大长度加1(加上最后的零)。
现在您可以如下定义fakeString
using fakeString = std::array<char, 10u>;
其中std::array
是一个foo
函数,在给定struct foo
{
static constexpr std::array<fakeString, 3u> a
{{ fs("a"), fs("bc"), fs("232") }};
};
constexpr std::array<fakeString, 3u> foo::a;
的C样式数组的情况下返回fs()
并使用constexpr
辅助函数
fakeString
和char
函数如下
fsh()
现在您可以按以下方式使用fs()
fsh()
请注意,您必须调用返回template <std::size_t ... Is, std::size_t N>
constexpr fakeString fsh (indexSequence<Is...> const &, char const (&s)[N])
{ return {{ s[Is]... }}; }
template <std::size_t N>
constexpr fakeString fs (char const (&s)[N])
{ return fsh(makeIndexSequence<N>{}, s); }
(即C风格的字符串)的foo::a
方法。
我重复:只是为了好玩。
以下是完整的C ++ 11示例
for ( auto const & fakeS : foo::a )
std::cout << fakeS.data() << std::endl;