Dr.Dobb的文章A Portable "typeof" Operator说
但是你不能使用类模板从表达式中提取类型,就像使用函数模板或重载一样。 (如果表达式是带有外部链接的名称,则可以通过使用模板非类型参数来实现带有类模板的typeof,但这不是很有用。)
括号中的粗体句是否正确?如果是这样,如何使用模板非类型参数来查找具有外部链接的表达式的类型?
答案 0 :(得分:2)
在不使用typeof
的情况下,C ++ 03无法实现sizeof
。最接近的有用替代方法是使用返回所需类型的函数模板来提取类型。
template<typename T>
struct Type
{
};
template<typename T>
Type<T> makeType(T)
{
return Type<T>();
}
int main()
{
int i;
makeType(2 + 2); // Type<int>
makeType(&i); // Type<int*>
}
以下技术使用C ++ 03中的函数模板来提取可在模板参数中使用的任何表达式的类型和值。
template<typename T, T value>
struct NonType
{
};
template<typename T>
struct Type
{
template<T value>
static NonType<T, value>
makeNonType()
{
return NonType<T, value>();
}
};
template<typename T>
Type<T> makeType(T)
{
return Type<T>();
}
#define MAKE_NONTYPE(e) makeType(e).makeNonType<e>()
int i;
int main()
{
MAKE_NONTYPE(2 + 2); // NonType<int, 4>
MAKE_NONTYPE(&i); // NonType<int*, i>
}
以下答案显示了此技术的实际用途,即提取指向成员函数表达式的指针的类型和值: How to allow templated functor work on both member and non-member functions
答案 1 :(得分:2)
它在C ++ 03中不起作用 - 这种方法实际上是荒谬的,我认为作者并没有完全认为这个想法。
但是,使用隐式模板参数(如针对C ++ 1Z所提出的),这实际上可以起作用:
template <using typename T, T&> struct infer {using type = T;};
int a;
infer<a>::type // int
但仍然无法检测a
是否为引用。