gpt4 book ai didi

c++ - 具有混合类型和非类型可变参数的模板模板参数

转载 作者:行者123 更新时间:2023-11-28 01:21:16 25 4
gpt4 key购买 nike

我在声明以下内容时遇到问题:

// 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;

只是编译器没有办法找出前后有多少类型。这就是为什么通常它在模板声明中只能采用一个参数包。但它可以专门处理多个参数包!

祝你好运!

关于c++ - 具有混合类型和非类型可变参数的模板模板参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56160149/

25 4 0
文章推荐: javascript - 使 Facebook 对话框提要框显示在与模式相同的窗口中,而不是弹出页面
文章推荐: javascript - jQuery 将外部 html 页面 <title> 插入另一个 html 页面
文章推荐: php - 在 CodeIgniter View 中的 标签中显示 PDF