C ++模板中的条件分支

时间:2018-03-17 23:11:36

标签: c++ templates metaprogramming template-meta-programming

此函数模板应该使用索引函数从元组返回类型X的第一个元素,但它不会编译。

template<class X, class F, class... R>
constexpr X getByType(tuple<F, R...> t) {
    if (is_same<F,X>::value) {
        return get<0>(t);                //ERROR POSITION
    }
    if (sizeof...(R) == 0) {
        throw 4;
    }
    return get_vector<X>(tail(t));
}

int main() {
    int i = get<int>(make_tuple(4.2,"assaaa",4));
}

编译器说它不能将双精度转换为int。这个元组的第一个元素是double。我想是if条件的原因是在运行时进行评估。如何在编译时执行元组的第一个元素的条件返回?

1 个答案:

答案 0 :(得分:0)

如果您的编译器不支持constexpr-if,您需要将一些逻辑分解为帮助器struct

示例实现(当然可以更有效地实现):

template<class X, class... List>
struct find_first;

template<class X, class... List>
struct find_first<X, X, List...> { static const int value = 0; };

template<class X, class Y, class... List>
struct find_first<X, Y, List...> { static const int value = find_first<X, List...>::value + 1; };

template<class X, class... R>
constexpr X getByType(tuple<R...> t) {
    return get<find_first<X,R...>::value>(t);
}

<强> Wandbox-Demo