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

标签 c++ templates c++11 ostream sfinae

我是一名初学者 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/

相关文章:

c++在解析错误输入时 boost 时间验证

c++ - vscode "No refactoring available"c++,(带 arduino 扩展)

c++ - 将 8 个位置的 int 数组转换为 char

c++11 - 以下 C++11 代码应该如何工作?

c++ - 调用模板显式实例化时如何开启自动匹配?

C++ 按值传递/按引用函数重载

c++ - 为什么 C 风格的转换行为与 dynamic_cast 不同?

c++ - GLUT - 什么是 imageloader.h,我怎样才能得到正确的?

javascript - 下划线模板 : Partials or includes

c# - 在 C++/CLI 中包装非托管 C++ 模板以供 C#/.NET 使用