我很好奇为什么在使用constexpr函数转发时类型检查失败。我认为它与替换有关,但由于什么规则不完全确切。
#include <iostream>
#include <type_traits>
#include <vector>
#include <cassert>
template <typename T, typename = void>
struct is_iterator {
static constexpr bool value = false;
};
template <typename T>
struct is_iterator<T, typename std::enable_if<!std::is_same<typename std::iterator_traits<T>::value_type, void>::value>::type> {
static constexpr bool value = true;
};
template <typename T>
constexpr bool isTypeIterator()
{
return is_iterator<T>::value;
}
int main()
{
std::vector<int> vec;
static_assert(!is_iterator<decltype(vec)>::value, "It is clear why this works");
static_assert(!is_type_iterator<decltype(vec)>, "I wonder why this is reversed");
}
答案 0 :(得分:2)
因为is_type_iterator<decltype(vec)>
是指向函数的非空指针,而不是对函数的调用。使用is_type_iterator<decltype(vec)>()
获得预期结果。
或者如果你想保留没有括号的语法,你可以试试C ++ 14变量模板:
template <typename T>
constexpr bool is_type_iterator = is_iterator<T>::value;