如何在c ++ 11中初始化std :: vector <std :: string>的静态constexpr成员?

时间:2018-09-10 19:30:12

标签: c++ c++11 static initialization constexpr

我正在尝试在类static constexpr std::vector中初始化std::stringFoo中的一个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,谢谢。

1 个答案:

答案 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辅助函数

fakeStringchar函数如下

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;