我正在测试我正在尝试用于模板条件的结构,但是我遇到了一些奇怪的编译器错误。这是我的代码:
#include <type_traits>
#include <string>
template<typename T1, typename T2,
bool SAME_SIZE = (sizeof(T1)==sizeof(T2))>
struct same_size
{
typedef typename std::false_type value;
};
template<typename T1, typename T2>
struct same_size<T1, T2, true>
{
typedef typename std::true_type value;
};
int main()
{
if(same_size<char,unsigned char>::value)
{
printf("yes");
}
system("PAUSE");
}
我正在Visual Studio 2015中编译它。这些是我得到的编译器错误:
1> main.cpp
1>c:\users\luis\documents\visual studio 2015\projects\stringtype\stringtype\main.cpp(18): error C2059: syntax error: ')'
1>c:\users\luis\documents\visual studio 2015\projects\stringtype\stringtype\main.cpp(19): error C2143: syntax error: missing ';' before '{'
有人能说清楚这里发生了什么吗?
答案 0 :(得分:2)
您将value
作为类型,而不是值。所以你不能在if
条件下使用它。你能做的最好的事情就是使用继承并节省打字。像这样:
#include <type_traits>
#include <string>
template<typename T1, typename T2,
bool SAME_SIZE = (sizeof(T1)==sizeof(T2))>
struct same_size : std::false_type
{
};
template<typename T1, typename T2>
struct same_size<T1, T2, true> : std::true_type
{
};
int main()
{
if(same_size<char,unsigned char>::value)
{
printf("yes");
}
system("PAUSE");
}
@GManNickG建议另一个(在我看来更好)解决方案:
template<typename T1, typename T2>
struct same_size : std::integral_constant<bool, sizeof(T1) == sizeof(T2)> {};
上述优点当然是减少打字和减少错误:在第一个解决方案中,您仍然可以编写same_size<int, int, false>::value
并得到错误的结果。
第二种解决方案的优点在于它仍然会生成与true_type
和false_type
兼容的产品类型,因为后者对应typedefs
是integral_constant
。
另一方面,在相同的代码中看模板元编程和printf
就像看到一对马画的航天飞机。