【发布时间】:2017-02-06 09:11:37
【问题描述】:
假设我有我的自定义字符串类:
class my_string : public std::string
{
// ...
}
我想创建一个模板函数,默认情况下同时接受my_string:
template <typename TString = my_string>
TString do_something(const TString& input)
{
// ...
}
但是当我调用它时:
auto result = do_something("abcdef");
它调用(当然)do_something<char[7]>()。如何强制它调用do_something<my_string> 明确指定类型(即写do_something("abcdef"),而不是do_something<my_string>("abcdef"))?
【问题讨论】:
-
注意:虽然只是一个例子,但永远不要从 std::string 派生!
-
我只想为
const char[]添加一个重载并将其转发给您要调用的函数。 -
文字字符串后缀可能会有所帮助:
"abcdef"s和operator "" _my_s"abcdef"_my_s。 -
为什么是模板? my_string 是一个 std::string (因此 std::string 应该可以转换为 my_string)
-
@boris 假定堆分配和多态指针。
new std::string和delete std::string已经是反模式,像std::string这样的堆分配管理器是代码异味。在智能指针和值语义包装器(又名现代 C++)的土地上,建议相对过时。智能指针可以存储它们的删除器,并且应该是创建对象的方式(不直接调用new),值语义包装器要么不调用删除,要么使用智能指针。