簡體   English   中英

錯誤 C2440 '<function-style-cast> ': 無法從 'char' 轉換為 'std::string'</function-style-cast>

[英]Error C2440 '<function-style-cast>': cannot convert from 'char' to 'std::string'

我正在嘗試遍歷 std::tuple 並檢索它占用的真實空間量(字節)。 要處理 std::string 我需要使用.length() function 但我無法編譯,並且出現以下錯誤:

錯誤 C2440 '':無法從 'char' 轉換為 'std::string'

我也嘗試過使用std::is_same (如評論)但沒有成功。 function 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);
}

演示

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM