繁体   English   中英

可变参数模板 function 的特殊化,用于 std::tuple 作为返回类型

[英]specialization of variadic template function for std::tuple as return type

我正在实现一个模板 function ,它解析一个字符串并返回一个对象元组,比如

template <typename... Objects>
std::tuple<Objects...> convert2data(const std::string_view& input) {
    return std::tuple<Objects...>{ internal::popNext<Objects>(input)... } ;
}

// usage
auto data = convert2data<int, double>("1, 0.01") ;

我将预期类型指定为模板 arguments。 现在我想从命名元组类型中“直接”获取类型,对于用户来说可能更方便:

using MyData = std::tuple<int, double> ; // included from some header
auto data = convert2data<MyData>("1, 0.01") ;
std::cerr << std::get<int>(data) ;
// or better
MyData data2 = convert2data("1, 0.01") ;

我一直试图为这种情况指定一个专业化,例如这个代码

template <typename... Objects, class std::tuple<Objects...>>
std::tuple<Objects...> convert2data(const std::string_view& input) {
    return convert2data<Objects...>(input) ;
}

没有被编译。 有没有办法为返回值中使用模板类型的模板 function 定义这种专门化?

沿着这些思路,也许:

template <typename Tuple, size_t... Is>
Tuple convert2dataHelper(const std::string_view& input,
                         std::index_sequence<Is...>) {
  return std::make_tuple(
      internal::popNext<std::tuple_element_t<Is, Tuple>>(input)...);
}

template <typename Tuple>
Tuple convert2data(const std::string_view& input) {
  return convert2dataHelper<Tuple>(
      input, std::make_index_sequence<std::tuple_size_v<Tuple>>{});
}

这允许convert2data<std::tuple<int, double>>("1, 0.01"); 句法。


另一种基于部分特化的方法,它允许convert2data<int, double>(...)convert2data<std::tuple<int, double>>(...)并执行相同的操作。

template <typename... Ts>
struct Convert2dataHelper {
  static std::tuple<Ts...> Do(const std::string_view& input) {
    return std::make_tuple(internal::popNext<Ts>(input)...);
  }
};

template <typename... Ts>
struct Convert2dataHelper<std::tuple<Ts...>> {
  static std::tuple<Ts...> Do(const std::string_view& input) {
    return Convert2dataHelper<Ts...>::Do(input);
  }
};

template <typename... Ts>
auto convert2data(const std::string_view& input) {
  return Convert2dataHelper<Ts...>::Do(input);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM