c++ - 如何初始化 std::vector 的静态 constexpr 成员在 C++11 中?
问题描述
我正在尝试在我的班级中初始化 a static constexpr std::vector
of s 。稍后我将使用其元素的地址。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
}
使用 c++11,谢谢。
解决方案
我可以使用 const 而不是 constexpr。但是没有办法做到这一点有点奇怪
你可以忍受这很好,const
但只是为了好玩,我向你展示了一种方法来制作一个比没有更好的constexpr
static
成员,它使用std::array
代替std::vector
和(再次)std::array
代替std::string
.
不幸的是,您使用的是 C++11,因此没有std::index_sequence
/ std::make_index_sequence
(从 C++14 开始可用),但我在以下完整示例中添加了 C++11 替代品。
如果您知道要在constexpr
成员中使用的字符串长度的上限值,例如 9(在您的示例中为 3),则可以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;
wherefs()
是一个constexpr
函数,它返回fakeString
给定的 C 样式数组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); }
现在你可以使用foo::a
如下
for ( auto const & fakeS : foo::a )
std::cout << fakeS.data() << std::endl;
请注意,您必须调用data()
返回 a 的方法char *
,即 C 风格的字符串。
我再说一遍:只是为了好玩。
下面是一个完整的 C++11 编译示例
#include <array>
#include <iostream>
template <std::size_t...>
struct indexSequence
{ using type = indexSequence; };
template <typename, typename>
struct concatSequences;
template <std::size_t... S1, std::size_t... S2>
struct concatSequences<indexSequence<S1...>, indexSequence<S2...>>
: public indexSequence<S1..., ( sizeof...(S1) + S2 )...>
{ };
template <std::size_t N>
struct makeIndexSequenceH
: public concatSequences<
typename makeIndexSequenceH<(N>>1)>::type,
typename makeIndexSequenceH<N-(N>>1)>::type>::type
{ };
template<>
struct makeIndexSequenceH<0> : public indexSequence<>
{ };
template<>
struct makeIndexSequenceH<1> : public indexSequence<0>
{ };
template <std::size_t N>
using makeIndexSequence = typename makeIndexSequenceH<N>::type;
using fakeString = std::array<char, 10u>;
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); }
struct foo
{
static constexpr std::array<fakeString, 3u> a
{{ fs("a"), fs("bc"), fs("232") }};
};
constexpr std::array<fakeString, 3u> foo::a;
int main ()
{
for ( auto const & fakeS : foo::a )
std::cout << fakeS.data() << std::endl;
}
推荐阅读
- arrays - 在MongoDB的数组数据中查找数组
- javascript - 我们是否需要包含 javascript 方法的返回类型
- javascript - reactstrap 样式显示问题
- algorithm - 在法雷序列的第 n 阶中找到第 k 个元素
- php - 添加具有自定义主题但未定义的“setSortable”的 Visual Composer 版本 5.1.1
- react-native - React 本机项目无法在我的外部设备上运行
- angular - 将数据从firebase检索到数组中
- c# - 如何在 asp.net 中修复“System.Data.SqlClient.SqlException:'列名或提供的值的数量与表定义不匹配。'”
- html - 在 Apple Mail 中使用 html 电子邮件签名的正文出现问题
- python - 尝试从字符串转换数字列表时出现错误“int() 的文字无效”