【发布时间】:2018-03-04 01:32:32
【问题描述】:
考虑以下代码:
static constexpr size_t Num {2};
struct S {
std::array<size_t, Num> get () { return {1, 2}; }
};
struct S1 : S {};
struct S2 : S {};
struct M {
template <typename T>
typename std::enable_if<std::is_same<T, S1>::value, S1>::type get () const {
return S1 {};
}
template <typename T>
typename std::enable_if<std::is_same<T, S2>::value, S2>::type get () const {
return S2 {};
}
};
我想要一个函数,将两个或多个std::arrays 合并为一个std::array。
到目前为止,我以这样的方式结束:
template <typename Mode, typename... Rs, size_t... Ns>
std::array<size_t, sizeof... (Rs)*Num> get_array (const Mode& mode, Sequence::Sequence<Ns...>) {
return {std::get<Ns> (mode.template get<Rs...> ().get ())...};
}
我想要下面的代码
M m;
auto x = get_array<M, S1, S2> (m, Sequence::Make<2> {});
产生std::array<size_t, 4> 填充{1, 2, 1, 2}。
其中Sequence::Sequence 和Sequence::Make 是described here。
我知道在这种情况下放置 Rs 的 ... 是不正确的(如果 sizeof... (Rs) 为 1 则很好,返回 std::array<size_t, 2> 和 {1, 2})但我不知道放在哪里进行如下所示的扩展:
std::get<0> (mode.template get<Rs[0]> ().get ()),
std::get<1> (mode.template get<Rs[0]> ().get ()),
std::get<0> (mode.template get<Rs[1]> ().get ()),
std::get<1> (mode.template get<Rs[1]> ().get ());
当然Rs[0] 我的意思是参数包中的第一个类型。
有可能吗?
【问题讨论】:
-
严格的 C++11 解决方案?没有 C++14?
-
@AndyG 不幸的是,在我需要这个的地方我只能访问 C++11 编译器,可悲但真实