Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++;toString成员函数和ostream运算符<&书信电报;通过模板进行集成 我是一个初学者C++开发人员,我有一个关于代码< toStope和 oStase通过模板整合操作员的问题。 我有这样的代码: 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; } struct MethodCheckerTypes{ typedef无符号字符TrueType; typedef长假型; }; templatestruct HasToString{ TemplateStaticTypeName方法CheckerTypes::TrueType测试(decltype(&K::toString)); 模板静态类型名方法CheckerTypes::FalseType测试(…); 静态常量布尔值=sizeof(测试(0))==sizeof(typename方法CheckerTypes::TrueType); typedef decltype(测试(0))ValueType; }; 模板结构IfDef{}; 模板结构IfDef{ typedef ostream&type; }; 类WithToString{ 公众: 字符串toString()常量{ 回复“你好”; } }; 模板typename IfDef::type operator_C++_Templates_C++11_Ostream_Sfinae - Fatal编程技术网

C++;toString成员函数和ostream运算符<&书信电报;通过模板进行集成 我是一个初学者C++开发人员,我有一个关于代码< toStope和 oStase通过模板整合操作员的问题。 我有这样的代码: 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; } struct MethodCheckerTypes{ typedef无符号字符TrueType; typedef长假型; }; templatestruct HasToString{ TemplateStaticTypeName方法CheckerTypes::TrueType测试(decltype(&K::toString)); 模板静态类型名方法CheckerTypes::FalseType测试(…); 静态常量布尔值=sizeof(测试(0))==sizeof(typename方法CheckerTypes::TrueType); typedef decltype(测试(0))ValueType; }; 模板结构IfDef{}; 模板结构IfDef{ typedef ostream&type; }; 类WithToString{ 公众: 字符串toString()常量{ 回复“你好”; } }; 模板typename IfDef::type operator

C++;toString成员函数和ostream运算符<&书信电报;通过模板进行集成 我是一个初学者C++开发人员,我有一个关于代码< toStope和 oStase通过模板整合操作员的问题。 我有这样的代码: 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; } struct MethodCheckerTypes{ typedef无符号字符TrueType; typedef长假型; }; templatestruct HasToString{ TemplateStaticTypeName方法CheckerTypes::TrueType测试(decltype(&K::toString)); 模板静态类型名方法CheckerTypes::FalseType测试(…); 静态常量布尔值=sizeof(测试(0))==sizeof(typename方法CheckerTypes::TrueType); typedef decltype(测试(0))ValueType; }; 模板结构IfDef{}; 模板结构IfDef{ typedef ostream&type; }; 类WithToString{ 公众: 字符串toString()常量{ 回复“你好”; } }; 模板typename IfDef::type operator,c++,templates,c++11,ostream,sfinae,C++,Templates,C++11,Ostream,Sfinae,实现operator的方法我采用了@Begemoth solution重载流操作符的方法你是一个初学者,从一开始就开始使用模板(C++最危险的功能)?你似乎是一个非常进步的初学者。:)干得好,谢谢。我想说我是模板开发新手。这个代码段使用了C++0x特性(decltype)。这个问题可能更适合codereview.stackexchange.com。谢谢!我想要无胸的方法。关于第一个建议:您的意思是我的所有类都必须使用toString从基抽象类继承。我考虑过这种方法,但想要更通用的解决方案。@Ma

实现
operator的方法我采用了@Begemoth solution重载流操作符的方法你是一个初学者,从一开始就开始使用模板(C++最危险的功能)?你似乎是一个非常进步的初学者。:)干得好,谢谢。我想说我是模板开发新手。这个代码段使用了C++0x特性(decltype)。这个问题可能更适合codereview.stackexchange.com。谢谢!我想要无胸的方法。关于第一个建议:您的意思是我的所有类都必须使用toString从基抽象类继承。我考虑过这种方法,但想要更通用的解决方案。@Malasar,从这样的通用类继承似乎毫无意义(除非类型系统强迫您这样做)。那么无BOOSTless方法呢
boost::lexical_cast
使用
std::stringstream
进行转换(在一般情况下),实现类似的功能并不难。明白了!我来检查一下你的情况。非常感谢您的回复!只是查看了自定义类的词法转换用法。非常有趣的解决方案。@Malasar,如果你对这个解决方案感到满意,那么你可以在作者的答案下面打上正确的记号。
template<typename T>
class ToString
{
public:
    std::string toString() const
    {
        return convertToString(static_cast<const T&>(*this));
    }
};

template<typename T>
inline std::string convertToString(const T& value)
{
    std::stringstream s;
    s << value;
    return s.str();
}
template<typename T>
inline std::string convertToString(const T& value)
{
    return boost::lexical_cast<std::string>(value);
}
class ToStringVirtual
{
public:
    virtual ~ToStringVirtual() {}
    virtual std::string toString() const = 0;
};

#define IMPLEMENT_ToStringVirtual public: std::string toString() const override { return convertToString(*this); }