[英]How do variadic type template parameters and non-type template parameters of the template template parameter of a nested class constrain each other?
[英]Template template parameter with mixed type and non-type variadic parameters
我在聲明以下內容時遇到了麻煩:
// c++17
template<typename T, typename ...Before, T v, typename ...After, template<typename ..., T, typename ...> U>
auto enum_to_type() {
// do things with
// U<Before..., v, After...> obj;
// as an example:
return U<Before..., v + 1, After...>{};
}
// demonstrate of usage
template<int v>
struct A {};
template<typename T, int v>
struct B {};
/// call enum_to_type to get next type
/// note: the following does not compile
using next_A = decltype(enum_to_type<int, 0, A>());
// == A<1>
template<typename T>
using next_B = decltype(enum_to_type<int, T, 0, B>());
// == B<1>
該函數的目的是編寫通用代碼,該通用代碼可利用非類型模板參數v
從類模板U
構造模板類,而無需了解如何在U
中聲明模板參數。 否則,一個具有寫這個功能對於不同的簽名例如U<T v>
U<typename, T v>
U<T v, typename>
,等等。
編輯:我想我想要的可能是不可能的。
可以進行一些修改:
//type container template
template<typename...>
struct types{};
//declaration
template<typename ,auto V, typename, template<typename ,decltype(V), typename...>class>
class enum_to_type;
//generic definition
template<typename First, typename ... Befors, First V, typename ... Afters, template<typename ,First, typename...>class U>
class enum_to_type<types<First, Befors...>, V, types<Afters...>, U>{
public:
static auto go(){
return U<types<Befors...>, V + 1, Afters...>{};
}
};
//specialization
template<auto V, typename ... Afters, template<typename ,decltype(V), typename...>class U>
class enum_to_type<types<>, V,types<Afters...>, U>{
public:
static auto go(){
return U<types<>, V + 1, Afters...>{};
//or
//return U<types<>, V, Afters...>{};
}
};
//Declarations and specializations for the target class templates
template<typename, int>
struct A{};
template<typename, int, typename>
struct B;
template<typename T, int V>
struct B<types<>, V, T > {};
using next_A = decltype(enum_to_type<types<int>, 0, types<>, A>::go());
template<typename T>
using next_B = decltype(enum_to_type<types<int>, 0, types<T>, B>());
template<typename, auto, typename...>
struct general_case;
template<typename ... befors, int V, typename ... afters>
struct general_case<types<befors...>, V, afters ...> {};
用法:
decltype(enum_to_type<types<>, 0, types<>, A>::go()) object_A;
decltype(enum_to_type<types<>, 0, types<int>, B>::go()) object_B;
decltype(enum_to_type<types<int, float>, 3, types<int>, general_case>::go()) object_general;
只是編譯器沒有辦法找出前后有多少種類型。 這就是為什么在模板聲明中通常只能使用一個參數包的原因。 但是它可以處理專門化的多個參數包!
祝好運!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.