标题说,看看我的最小例子:
template<class ptr_to_t>
void f(ptr_to_t x) {
typedef ptr_to_t t; // does not compile
t elem = *x;
}
int main()
{
int five = 5;
f<int*>(&five);
return 0;
}
编译如下:
g++ -Wall typedef.cpp -o typedef
这不编译。我想要的是更改标记的行(第3行),使t
的类型为int
(在此实例化中)。
注意:我想这是重复的,但我真的无法在任何地方找到这个问题。
答案 0 :(得分:11)
是的,有可能。您应该使用type_traits
标题中的std::remove_pointer
:
typedef typename std::remove_pointer<ptr_to_t>::type t;
在pre-C ++ 11中,您可以编写自己的实现(例如,在上面的链接中):
template< class T > struct remove_pointer {typedef T type;};
template< class T > struct remove_pointer<T*> {typedef T type;};
template< class T > struct remove_pointer<T* const> {typedef T type;};
template< class T > struct remove_pointer<T* volatile> {typedef T type;};
template< class T > struct remove_pointer<T* const volatile> {typedef T type;};
答案 1 :(得分:5)
您应该使用C ++ 11 std::remove_pointer:
#include <type_traits>
template<class ptr_to_t>
void f(ptr_to_t x) {
typedef ptr_to_t t; // does not compile
typename std::remove_pointer<t>::type elem = *x;
}
int main()
{
int five = 5;
f<int*>(&five);
return 0;
}
(编译于IdeOne)
如果定位到C ++ 03,您可以改为使用boost::remove_pointer或提供自己的实施(感谢即将竞争的答案,compiled in IdeOne):
template< class T > struct remove_pointer {typedef T type;};
template< class T > struct remove_pointer<T*> {typedef T type;};
template< class T > struct remove_pointer<T* const> {typedef T type;};
template< class T > struct remove_pointer<T* volatile> {typedef T type;};
template< class T > struct remove_pointer<T* const volatile> {typedef T type;};