【发布时间】:2017-09-07 10:02:40
【问题描述】:
为什么这段代码有奇怪的输出?如何以正确的方式测试类型?
#include <iostream>
#include <tuple>
#include <type_traits>
template<typename T> struct is_tuple : std::false_type {};
template<typename... Ts> struct is_tuple<std::tuple<Ts...>> : std::true_type {};
struct TraitBlock {
using BlockLocation = struct { std::uint64_t x, y, z; };
};
struct TraitRock {};
struct ItemTemplate{
static constexpr auto traits = std::make_tuple(
TraitBlock{},
TraitRock{}
);
};
int main(){
using A = std::tuple<char, int,double,char>;
std::cout << is_tuple<decltype(ItemTemplate::traits)>::value
<< is_tuple<decltype(std::make_tuple(
TraitBlock{},
TraitRock{}
))>::value
<< std::endl;
}
我使用 mingw64-gcc 7.2.0 和 -std=c++17,我得到输出“01” 为什么我得到两个不同的输出?他们不是同一类型吗?
【问题讨论】:
-
你可以使用类似
template <typename> struct Dummy; template struct Dummy<decltype(ItemTemplate::traits)>;的东西让编译器给你错误信息的类型。
标签: c++ c++11 template-meta-programming sfinae