6

假设我想创建一个函数,它通过引用同时接受左值和右值字符串参数,将它们转换为大写,并将它们打印到标准输出:

void upper_print(std::string& s);
void upper_print(std::string&& s);

这可以正常工作,如下所示:

std::string s("Hello world");
upper_print(s);
upper_print(std::string("Hello world"));
upper_print("Hello world"); // converting ctor used

但是,为避免冗余,我想改用转发引用:

template <typename T> upper_print(T&& s);

不幸的是,我不能upper_print用字符串文字参数调用:

std::string s("Hello world"); // OK
upper_print(s); // OK
upper_print(std::string("Hello world")); // OK
upper_print("Hello world"); // ERROR

我知道将参数限制为std::string对象的可能性,例如,通过使用std::enable_ifor static_assert。但这在这里没有帮助。

从这个意义上说,是否有任何选项可以结合转发引用和转换构造函数的功能?

4

1 回答 1

0

也许像这样的解决方案?

template <typename T>
void upper_print_helper(T&& s);

inline void upper_print(std::string&& s) {
    upper_print_helper(std::move(s));
}
inline void upper_print(std::string& s) {
    upper_print_helper(s);
}
于 2017-07-11T09:53:24.107 回答