为什么我的isVector函数不返回true?

时间:2017-02-13 17:58:00

标签: c++ constexpr decltype

根据this问题,我尝试了is_vector特征:

#include <iostream>
#include <vector>

using namespace std;

template<typename T>
struct is_vector { 
        constexpr static bool value = false;
};

template<typename T>
struct is_vector<std::vector<T>> { 
        constexpr static bool value = true;
};

int main() { 
    int A;
    vector<int> B;

    cout << "A: " << is_vector<decltype(A)>::value << endl;
    cout << "B: " << is_vector<decltype(B)>::value << endl;

    return 0;
}

输出:

A: 0
B: 1

这可以按预期工作。但是,当我尝试将其放在一个小辅助函数中时,is_vector会为false返回B

template<typename T>
constexpr bool isVector(const T& t) { 
        return is_vector<decltype(t)>::value;
}
...
cout << "B: " << isVector(B) << endl;  // Expected ouptput: "B: 1"

输出:

B: 0

我在这里缺少什么?

1 个答案:

答案 0 :(得分:6)

此处的问题是tconst std::vector<int>&,与struct is_vector<std::vector<T>>不匹配。您在函数中真正想要的是使用T,它被推导为std::vector<T>,它可以正常工作。做到这一点

template<typename T>
constexpr bool isVector(const T& t) { 
        return is_vector<T>::value;
}