我是一名初學C++開發人員,我對通過模板的toString
和ostream
運算符集成有疑問。 我有這樣的代碼:C++ toString成員函數和ostream運算符<<通過模板集成
struct MethodCheckerTypes{
typedef unsigned char TrueType;
typedef long FalseType;
};
template<typename T>struct HasToString{
template<typename K>static typename MethodCheckerTypes::TrueType test(decltype(&K::toString));
template<typename> static typename MethodCheckerTypes::FalseType test(...);
static const bool value = sizeof(test<T>(0)) == sizeof(typename MethodCheckerTypes::TrueType);
typedef decltype(test<T>(0)) ValueType;
};
template<typename T, typename K> struct IfDef{};
template<> struct IfDef<typename MethodCheckerTypes::TrueType, ostream&>{
typedef ostream& type;
};
class WithToString{
public:
string toString() const{
return "hello";
}
};
template<typename F, typename CharT, typename Traits> typename IfDef<typename HasToString<F>::ValueType, basic_ostream<CharT, Traits>&>::type operator<<(basic_ostream<CharT, Traits>& out, const F &ref){
out<<ref.toString().c_str();
return out;
}
int main(int argc, char **argv){
WithToString hasToString;
cout<<hasToString<<endl;
return 0;
}
的代碼已經compilled沒有錯誤,並且應用程序successfuly執行。 使用這種方法很好嗎?我想在沒有任何幫助的情況下實施它。
你是一個初學者* *,並開始從一開始就與*模板*彈(C最危險的特性++)? – Nawaz 2011-04-29 11:25:22
你似乎是一個非常進步的初學者。 :)很高興。 – iammilind 2011-04-29 11:27:07
謝謝。我想說我是初學者模板開發人員。此代碼片段使用C++ 0x功能(decltype)。 – Malasar 2011-04-29 11:35:09