错误 C2440'<function-style-cast>':无法从'char'转换为'std::string'



我正在尝试对std::元组进行迭代,并检索它所占用的实际空间量(字节(。为了处理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, NthTypeOf<I, 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);
}

演示

最新更新