※ 引述《littleshan (我要加入劍道社!)》之銘言:
: http://www.cplusplus.com/reference/std/iterator/iterator_traits/
: 所以這樣寫就可以了
: template < typename IterType >
: class Foo {
: typedef typename std::iterator_traits<IterType>::value_type ValueType;
: } ;
: iterator_traits 的優點是不需要 c++0x 的 decltype
: 而且它會幫你去掉 const 與 reference
: 直接用 pointer 當 IterType 也是 OK 的
: 不過使用者傳入的 IterType 必需依照 STL 的慣例進行定義
: 也就是 IterType 自己要有 value_type/reference_type 等等的 member type
: 如果你預設 user 只會傳 pointer 和 STL iterator
: 那 iterator_traits 是最方便的解法
謝謝提醒 :)
參考STL的作法小改一下,應可符合原po需要:
#include <iostream>
#include <string>
using namespace std;
template <typename T>
struct Foo {
typedef T ValueType;
};
template <typename T>
struct Foo<T*> {
typedef T ValueType;
};
int main() {
Foo<int*>::ValueType a = 1; // int
Foo<int>::ValueType b = 1; // int
Foo<char*>::ValueType c = 'A'; // char
Foo<char>::ValueType d = 'B'; // char
Foo<string*>::ValueType e = "Hello World"; // string
Foo<string>::ValueType f = "Hello World"; // string
cout << a << endl;
cout << b << endl;
cout << c << endl;
cout << d << endl;
cout << e << endl;
cout << f << endl;
}
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 59.120.38.226