我需要一個模板結構串列,其可變引數只能是某些容器模板串列的特化所代表的型別。不同的 Lists 實體應該能夠依賴于不同的(但對于一個實體是固定的)模板 List。
也就是說,我想生成代碼,相當于以下偽代碼:
template<typename...>
struct Lists;
// pseudocode. Is there a way to do something similar?
template<template<typename...> typename List, typename... Types>
struct Lists<List<Types...>...>{};
int main()
{
Lists<std::pair<int, char>,std::pair<double, char>> lists;
Lists<std::tuple<int, char>,std::tuple<double, char>> lists;
//Lists<std::pair<int, char>,std::tuple<double, char>> lists; // must cause a compilation error
return 0;
}
我怎樣才能在現代 C 中做到這一點?
uj5u.com熱心網友回復:
template <template <typename...> typename, typename>
inline constexpr bool is_specialization_of = false;
template <template <typename...> typename Template, typename... Ts>
inline constexpr bool is_specialization_of<Template, Template<Ts...>> = true;
template <typename...>
struct Lists;
template <template <typename...> typename Template, typename... Ts,
typename... Others>
requires(is_specialization_of<Template, Others> && ...)
struct Lists<Template<Ts...>, Others...> {};
int main() {
Lists<std::pair<int, char>, std::pair<double, char>> lists0; // OK
Lists<std::tuple<int, char>, std::tuple<double, char>> lists1; // OK
/* Lists<std::pair<int, char>,std::tuple<double, char>> lists2; */ // ERROR
}
godbolt.org 上的實時示例
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/515123.html
標籤:C 模板参数包
下一篇:模板類c 中的靜態變數
