我以为我知道C ++。错。
template<typename T>
struct string_type_name;
#define DEFINE_TYPE_NAME(Type) \
template<> struct string_type_name<Type> \
{ \
static char const * _() \
{ \
return #Type; \
} \
}
DEFINE_TYPE_NAME(float);
DEFINE_TYPE_NAME(double);
DEFINE_TYPE_NAME(long double);
来自Boost.Math的代码。这个宏做了什么以及为什么需要它? template<>
意味着什么,没有争论?我们为什么要声明这个函数static char const * _()
?
答案 0 :(得分:2)
我们只是展开宏:
template<typename T>
struct string_type_name;
template<> struct string_type_name<float>
{
static char const * _()
{
return "float";
}
}
template<> struct string_type_name<double>
{
static char const * _()
{
return "double";
}
}
template<> struct string_type_name<long double>
{
static char const * _()
{
return "long double";
}
}
每个以template<>
开头的结构都是上面声明的string_type_name
类的特化。您会注意到非专用模板实际上没有定义 - 这是为了防止您使用不是专门的类型之一来实例化它。
_
函数(不是一个非常好的名称)返回一个char const*
,它是表示它专门用于的类型的字符串文字。也就是说,它只是从类型到字符串的映射:string_type_name<float>::_()
将返回"float"
。您可以在下面看到他们如何使用它:
BOOST_TEST_MESSAGE("Testing multiplication for "
<< string_type_name<T>::_() << ".");