如何创建模板函数,返回其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
这个问题有更好的(更轻量级,可扩展的)解决方案吗?
答案 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%满意,但这比问题中的示例更好。