我有模板代码需要将一些模板类型转换为字符串。为此,我为我自己的类型重载to_string。但是类型也可以是一个字符串。然后编译失败,因为类型字符串本身没有to_string重载(只返回它的参数)。
编辑: 示例代码:
template<class T>
class TemplatedClass
{
public:
string toString() const
{
// this should work for both simple types like int, double, ...
// and for my own classes which have a to_string overload
// and also for string, which is the reason for my question
return string("TemplatedClass: ").append(to_string(t_));
}
private:
T t_;
};
答案 0 :(得分:7)
您可以使用适当的重载编写自己的模板化函数,如下所示:
#include <iostream>
#include <string>
using namespace std;
template<typename T>
std::string toString(const T& t) {
return std::to_string(t);
}
std::string toString(const char* t) {
return t;
}
std::string toString(const std::string& t) {
return t;
}
int main() {
cout << toString(10) << endl;
cout << toString(1.5) << endl;
cout << toString("char*") << endl;
cout << toString(std::string("string")) << endl;
return 0;
}
答案 1 :(得分:6)
您可以将所有std::to_string
和所有to_string
合并为using
derective。并按值传递std::string
以最小化副本数:
#include <string>
#include <iostream>
namespace convert {
std::string to_string(std::string s)
{
return s;
}
template<class T>
std::string stringify(T&& t)
{
using convert::to_string;
using std::to_string;
return to_string(std::forward<T>(t));
}
}
class Foo
{
public:
operator std::string () const { return "Foo"; }
};
namespace bar {
class Bar
{};
std::string to_string(const Bar&) {
return "Bar";
}
}
int main()
{
std::string s{"I'm lvalue string"};
std::cout << convert::stringify(42) << "\n";
std::cout << convert::stringify(std::string("I'm string")) << "\n";
std::cout << convert::stringify("I'm c-string") << "\n";
std::cout << convert::stringify(s) << "\n";
std::cout << convert::stringify(Foo{}) << "\n";
std::cout << convert::stringify(bar::Bar{}) << "\n";
return 0;
}
请注意,使用我的方法,您不需要const char *
或任何其他可转换为字符串的类型的重载。此外,这种方法允许用户为任何类添加to_string
重载(它将通过参数依赖查找找到)。
为了进一步优化convert::to_string
,可以将按值接受字符串分为左值和右值重载。