如何解决错误 C2440“<function-style-cast>”:无法从“char”转换为“std::string” 代码
我正在尝试遍历 std::tuple 并检索它占用的真实空间量(字节)。要处理 std::string 我需要使用 .length()
函数,但我无法编译,并且出现以下错误:
错误 C2440 '': 无法从 'char' 转换为 'std::string'
我也尝试过使用 std::is_same
(如评论)但没有成功。函数 iterate_tuple_types
的调用方式如下:
tuple <char,unsigned int,double,std::string> src;
src = make_tuple('a',10,0.333333333333333,std::string("some string"));
iterate_tuple_types(src);
代码
template <typename T,typename S>
struct is_string {
static const bool value = false;
};
template <class T,class Traits,class Alloc>
struct is_string<T,std::basic_string<T,Traits,Alloc> > {
static const bool value = true;
};
template<int N,typename... Ts> using NthTypeOf =
typename std::tuple_element<N,std::tuple<Ts...>>::type;
template <size_t I = 0,typename... Ts>
typename std::enable_if<I == sizeof...(Ts),size_t>::type
iterate_tuple_types(std::tuple<Ts...> tup) {
return 0;
}
template <size_t I = 0,typename... Ts>
typename std::enable_if<(I < sizeof...(Ts)),size_t>::type
iterate_tuple_types(std::tuple<Ts...> tup) {
size_t result = 0;
// std::is_same<std::string,NthTypeOf<I,Ts...> >::value
if (std::is_integral<NthTypeOf<I,Ts...> >::value) {
result += sizeof(NthTypeOf<I,Ts...>);
}
else if (is_string<std::string,Ts...> >::value) {
result += static_cast<size_t>(std::string(std::get<I>(tup)).length());
}
return result + iterate_tuple_types<I + 1>(tup);
}
我的做法正确吗?为什么会出现错误?
编辑
我能够找到如下所示的字符串的长度,但是构造一个字符串流并将内容刷新到它似乎效率很低?
typename std::tuple_element<I,std::tuple<Ts...> >::type test = std::get<I>(tup);
std::stringstream ss(test);
result += static_cast<size_t>(ss.str().length());
解决方法
可能是这样的:
template <typename T>
size_t LengthOf(const T&) { return sizeof(T); }
template <typename ... Params>
size_t LengthOf(const std::basic_string<Params...>& s) { return s.length(); }
template <typename Tup>
size_t iterate_tuple_types(const Tup& t) {
auto sum_length = [](const auto&... args) {
return (LengthOf(args) + ...);
};
return std::apply(sum_length,t);
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。