gpt4 book ai didi

C++ toString 成员函数和 ostream 运算符 << 通过模板集成

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:35:08 25 4
gpt4 key购买 nike

我是一名初学者 C++ 开发人员,我对通过模板集成 toStringostream 运算符有疑问。我有这样的代码:

    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;
}

代码编译无误,应用程序执行成功。使用这样的方法好吗?我想在没有任何 boost 帮助的情况下实现它。

最佳答案

实现方法operator<<本身是正常的。但是使用你不理解的部分语言是不好的做法(我不相信初学者可以写出这样的代码)。您有两种选择:实现 toString成员函数或重载 operator<<(std::ostream&, T) .后一种方法使您能够使用 boost::lexical_cast将对象转换为字符串。对于我来说,后一种方法更像 C++,如果你可以在没有成员函数的情况下做一些事情,那么这样做会更好。

关于C++ toString 成员函数和 ostream 运算符 << 通过模板集成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5831353/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com