类型从字符阵列到std :: string
type deduction from char array to std::string
我正在尝试使用variadic模板编写sum
函数。在代码中,我会写
sum(1, 2., 3)
它将返回总和的大多数通用类型(在这种情况下-double
)。问题是字符。当我称其为
sum("Hello", " ", "World!")
模板参数被描述为const char [7]
,因此不会编译。我找到了将最后一个参数指定为 std::string("World!")
的方法,但是它不是很漂亮,是否有任何方法可以将自动类型扣除到 std::string
或正确地超载 sum
?
我到目前为止的代码:
template<typename T1, typename T2>
auto sum(const T1& t1, const T2& t2) {
return t1 + t2;
}
template<typename T1, typename... T2>
auto sum(const T1& t1, const T2&... t2) {
return t1 + sum(t2...);
}
int main(int argc, char** argv) {
auto s1 = sum(1, 2, 3);
std::cout << typeid(s1).name() << " " << s1 << std::endl;
auto s2 = sum(1, 2.0, 3);
std::cout << typeid(s2).name() << " " << s2 << std::endl;
auto s3 = sum("Hello", " ", std::string("World!"));
std::cout << typeid(s3).name() << " " << s3 << std::endl;
/* Won't compile! */
/*
auto s4 = sum("Hello", " ", "World!");
std::cout << typeid(s4).name() << " " << s4 << std::endl;
*/
return 0;
}
输出:
i 6
d 6
Ss Hello World!
我只会编写一个简单的过载身份函数,该功能专门处理const char*
。
template<typename T>
decltype(auto) fix(T&& val)
{
return std::forward<T>(val);
}
auto fix(char const* str)
{
return std::string(str);
}
template<typename T1, typename T2>
auto sum(const T1& t1, const T2& t2) {
return fix(t1) + t2;
}
template<typename T1, typename... T2>
auto sum(const T1& t1, const T2&... t2) {
return t1 + sum(t2...);
}
最终您的char
指针类型不能很好地处理在operator +
的左和右侧。如果需要。
在下面,我将Liberty重构为单帕拉姆支持的sum
(不是必需的步骤,但允许sum(x)
超载,这更清楚地理解)。希望您能得到这个主意。
#include <iostream>
#include <string>
// generic identity
template<typename T1>
auto sum(const T1& t1)
{
std::cout << __PRETTY_FUNCTION__ << 'n';
return t1;
}
// specialized for const char [N]
auto sum(const char *s)
{
std::cout << __PRETTY_FUNCTION__ << 'n';
return std::string(s);
}
template<typename T1, typename... T2>
auto sum(const T1& t1, const T2&... t2)
{
std::cout << __PRETTY_FUNCTION__ << 'n';
return t1 + sum(t2...);
}
int main(int argc, char** argv) {
std::cout << sum(1,2,3) << 'n';
std::cout << sum(1, 2.0, 3) << 'n';
std::cout << sum("Hello", " ", std::string("World!")) << 'n';
std::cout << sum("Hello", " ", "World!");
return 0;
}
输出
auto sum(const T1 &, const T2 &...) [T1 = int, T2 = <int, int>]
auto sum(const T1 &, const T2 &...) [T1 = int, T2 = <int>]
auto sum(const T1 &) [T1 = int]
6
auto sum(const T1 &, const T2 &...) [T1 = int, T2 = <double, int>]
auto sum(const T1 &, const T2 &...) [T1 = double, T2 = <int>]
auto sum(const T1 &) [T1 = int]
6
auto sum(const T1 &, const T2 &...) [T1 = char [6], T2 = <char [2], std::__1::basic_string<char>>]
auto sum(const T1 &, const T2 &...) [T1 = char [2], T2 = <std::__1::basic_string<char>>]
auto sum(const T1 &) [T1 = std::__1::basic_string<char>]
Hello World!
auto sum(const T1 &, const T2 &...) [T1 = char [6], T2 = <char [2], char [7]>]
auto sum(const T1 &, const T2 &...) [T1 = char [2], T2 = <char [7]>]
auto sum(const char *)
Hello World!
最佳幸运
相关文章:
- cppcheck在const std::string[]上引发警告
- 将std::string传递给WriteConsole API
- 为std::string的某个索引赋值
- 使用 std::string () const 函数启动线程或未来
- 当我们进行一些操作时,应该使用什么'std::string'或'std::stringstream'?
- 如何更改大小(std::string)
- std::string 的对象真的可以移动吗?
- SegFault 同时使用 std::string::operator+= 和函数作为参数
- 无法从 std::string 中提取C++ Unicode 符号
- std::string 构造函数如何处理固定大小的 char[]?
- 真的没有来自 std::string_view 的 std::string 的显式构造函数吗?
- 将C++ std::string 转换为 UTF-16-LE 编码的字符串
- 重载 + 自己的类和 std::string 的运算符
- 如何使用 std::string 作为 QHash 的键?
- 将日语 wstring 转换为 std::string
- 可以从std::string继承以提供类型一致性吗
- 构造函数采用std::string_view与std::string并移动
- 在共享缓冲区内存中创建 ::std::string 对象
- std::string.size() 未知行为
- Valgrind 在 std::string::swap 中报告 SIGILL