假设我有我的自定义字符串类:

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"))?

最佳答案

专门针对“从字符串参数构造”。

template <typename TString = my_string,
typename std::enable_if<std::is_base_of<std::string, TString>::value>::type = nullptr>
TString do_something(const TString& input)
{
    // ...
}

template <typename ...Args,
typename std::enable_if<std::is_constructible<my_string, Args....>::value>::type = nullptr>
my_string do_something(Args&&... args)
{
    return do_something<my_string>({args});
}

10-04 21:16