使用可变 class 模板类型的成员函数的结果初始化数组?
Initializing array with results of variadic class template type's member function?
假设我有一个模板类型...
template<typename ...Ts>
struct SomeStruct {
std::tuple<Ts...> some_tuple;
}
... 我确定从 Ts
扩展的任何类型都共享一个基础 class,因此某些成员函数 returns 某些类型 R
.
我怎样才能收集在 Ts
中的每种类型上调用该成员函数的结果,例如在 std::array< R, sizeof...(Ts) >
中?
鉴于所有 Ts...
元素都支持 foo()
方法,返回 R
值,我想你可以使用 std::apply()
,如果你可以使用 C+ +17
std::apply([](auto ... vals)
{ return std::array<R, sizeof...(vals)>{ vals.foo()... }; },
some_tuple);
或者只是
std::apply([](auto ... vals)
{ return std::array { vals.foo()... }; },
some_tuple);
使用 std::array
演绎指南。
如果您只能使用 C++14,则可以使用 std::make_index_sequence
/std::index_sequence
模拟 std::apply()
假设我有一个模板类型...
template<typename ...Ts>
struct SomeStruct {
std::tuple<Ts...> some_tuple;
}
... 我确定从 Ts
扩展的任何类型都共享一个基础 class,因此某些成员函数 returns 某些类型 R
.
我怎样才能收集在 Ts
中的每种类型上调用该成员函数的结果,例如在 std::array< R, sizeof...(Ts) >
中?
鉴于所有 Ts...
元素都支持 foo()
方法,返回 R
值,我想你可以使用 std::apply()
,如果你可以使用 C+ +17
std::apply([](auto ... vals)
{ return std::array<R, sizeof...(vals)>{ vals.foo()... }; },
some_tuple);
或者只是
std::apply([](auto ... vals)
{ return std::array { vals.foo()... }; },
some_tuple);
使用 std::array
演绎指南。
如果您只能使用 C++14,则可以使用 std::make_index_sequence
/std::index_sequence
std::apply()