返回其INDEX'参数的模板函数

时间:2017-09-25 01:24:03

标签: c++

如何创建模板函数,返回其INDEX'参数?

template <int INDEX, typename ...PARAMETERS>
auto &&select(PARAMETERS&& ...parameters);

我知道“重量级”解决方案:

template <int INDEX, typename ...PARAMETERS>
auto &&select(PARAMETERS&& ...parameters) {
    std::tuple<PARAMETERS&&...> t(parameters...);
    return std::get<INDEX>(t);
}

我真的不喜欢这个解决方案,因为它在很大程度上取决于编译器优化器。此外,由于不必要的元组,它可能会减慢调试版本。

或者我知道一个不太可扩展(但性能良好)的解决方案:

template <int INDEX>
struct SelectNthParameter;

template <>
struct SelectNthParameter<0> {
    template <typename PAR0, typename ...TAIL>
    static PAR0 &&value(PAR0 &&par0, TAIL&& ...tail) {
        return forward<PAR0>(par0);
    }
};

template <>
struct SelectNthParameter<1> {
    template <typename PAR0, typename PAR1, typename ...TAIL>
    static PAR1 &&value(PAR0 &&par0, PAR1 &&par1, TAIL&& ...tail) {
        return forward<PAR1>(par1);
    }
};
// add more template specializations for 2...inf

这个问题有更好的(更轻量级,可扩展的)解决方案吗?

1 个答案:

答案 0 :(得分:0)

这是我想出的,没有什么惊天动地的事情:

template <int INDEX>
struct SelectNthParameter {
    template <typename HEAD, typename ...TAIL>
    __attribute__((always_inline))
    static auto &&value(HEAD &&head, TAIL &&...tail) {
        return SelectNthParameter<INDEX-1>::value(tail...);
    }
};

template <>
struct SelectNthParameter<0> {
    template <typename HEAD, typename ...TAIL>
    __attribute__((always_inline))
    static auto &&value(HEAD &&head, TAIL &&...) {
        return std::forward<HEAD>(head);
    }
};

由于always_inline,此解决方案比tuple更有效(在调试版本中,每个参数只生成2个asm指令,远远小于tuple版本)。

我可以更确定这将在发布版本中进行优化。我对此解决方案也不是100%满意,但这比问题中的示例更好。