我正在實作一個模板函式,它決議一個字串并回傳一個物件元組,比如
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") ;
我將預期型別指定為模板引數。現在我想從命名的元組型別“直接”獲取型別,這對用戶來說可能更方便:
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) ;
}
不會被編譯。有沒有辦法為在回傳值中使用模板型別的模板函式定義這種特殊化?
uj5u.com熱心網友回復:
沿著這些路線的東西,也許:
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);
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/377585.html
下一篇:無法在Vue3中傳遞多個道具
