C++ 填充std::tuple

C++ 填充std::tuple,c++,tuples,variadic-templates,boost-fusion,C++,Tuples,Variadic Templates,Boost Fusion,我有一个重载函数,它看起来像: template<typename T> T getColumn(size_t i); template<> std::string getColumn<std::string>(size_t i) { if(i == 0) return "first"; else return "other"; } template<> int getColumn<int&

我有一个重载函数,它看起来像:

template<typename T>
T getColumn(size_t i);

template<>
std::string getColumn<std::string>(size_t i) {
    if(i == 0)
        return "first";
    else
        return "other";
}

template<>
int getColumn<int>(size_t i) {
    return i*10;
}

// ...
如何从值为每种类型调用getColumn。。。使用正确的i值并将结果保存在std::tuple中?

可能使用自动:

在C++14中,您可以省略->decltype。。。零件,因为它将从功能体中推导。

可能与自动:


在C++14中,您可以省略->decltype。。。部分,因为它将从函数体中推导。

您需要将参数包的每个元素映射到其在包中的索引-这是索引序列技巧的典型用例:

template <int... I> struct index_sequence {};
template <int N, int... I>
struct make_index_sequence : make_index_sequence<N-1,N-1,I...> {};
template <int... I>
struct make_index_sequence<0, I...> : index_sequence<I...> {};

template<typename... Values, int... I>
auto getColumns(index_sequence<I...>) ->
  decltype(std::make_tuple(getColumn<Values>(I)...)) {
    return std::make_tuple(getColumn<Values>(I)...);
}

template<typename... Values>
auto getColumns() ->
  decltype(getColumns<Values...>(make_index_sequence<sizeof...(Values)>())) {
    return getColumns<Values...>(make_index_sequence<sizeof...(Values)>());
}

您需要将参数包的每个元素映射到包中的索引-这是索引序列技巧的典型用例:

template <int... I> struct index_sequence {};
template <int N, int... I>
struct make_index_sequence : make_index_sequence<N-1,N-1,I...> {};
template <int... I>
struct make_index_sequence<0, I...> : index_sequence<I...> {};

template<typename... Values, int... I>
auto getColumns(index_sequence<I...>) ->
  decltype(std::make_tuple(getColumn<Values>(I)...)) {
    return std::make_tuple(getColumn<Values>(I)...);
}

template<typename... Values>
auto getColumns() ->
  decltype(getColumns<Values...>(make_index_sequence<sizeof...(Values)>())) {
    return getColumns<Values...>(make_index_sequence<sizeof...(Values)>());
}

需要索引:OP想要调用GetColumni…需要索引:OP想要调用GetColumni…一个很好的副作用是helper函数也很有用。但是它可以通过默认参数消除吗,或者换句话说,使helper函数成为唯一的一个吗?@Yakk我认为不是:中间类型是推导索引所必需的。没有指定为参数包提供默认值的语法请参见[temp.param]/1.Can Values。。。,用于生成第二个参数的默认参数,从中。。。那么,这是什么呢?可能不是:即使它已编译,我也希望使用标准的delve来确保它不是意外的扩展。这正是我所需要的,谢谢!助手函数对我来说不是问题。我已经将函数集成到一个类中,并将助手设置为私有。在成员函数上使用decltype时要小心,因为GCC有一个bug,所以您需要显式地使用它->。Clang没有这个问题。一个很好的副作用是helper函数也很有用。但是它可以通过默认参数消除吗,或者换句话说,使helper函数成为唯一的一个吗?@Yakk我认为不是:中间类型是推导索引所必需的。没有指定为参数包提供默认值的语法请参见[temp.param]/1.Can Values。。。,用于生成第二个参数的默认参数,从中。。。那么,这是什么呢?可能不是:即使它已编译,我也希望使用标准的delve来确保它不是意外的扩展。这正是我所需要的,谢谢!助手函数对我来说不是问题。我已经将函数集成到一个类中,并将助手设置为私有。在成员函数上使用decltype时要小心,因为GCC有一个bug,所以您需要显式地使用它->。叮当声没有这个问题。
template<typename... Values>
auto getColumns() -> decltype(std::make_tuple(getColumns<Values>()...))
{
    return std::make_tuple(getColumns<Values>()...);
}
template <int... I> struct index_sequence {};
template <int N, int... I>
struct make_index_sequence : make_index_sequence<N-1,N-1,I...> {};
template <int... I>
struct make_index_sequence<0, I...> : index_sequence<I...> {};

template<typename... Values, int... I>
auto getColumns(index_sequence<I...>) ->
  decltype(std::make_tuple(getColumn<Values>(I)...)) {
    return std::make_tuple(getColumn<Values>(I)...);
}

template<typename... Values>
auto getColumns() ->
  decltype(getColumns<Values...>(make_index_sequence<sizeof...(Values)>())) {
    return getColumns<Values...>(make_index_sequence<sizeof...(Values)>());
}