gpt4 book ai didi

c++ - 如何传输模板?

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:41:55 25 4
gpt4 key购买 nike

我想要一个Base具有 2 个模板参数的模板类。特别地,第二个参数是模板参数。 Derived源自 Base与CRTP。现在我想生成 Derived 的基类喜欢Base<Derived,Derived::second_tmpl> ,但生成的基类与 Derived 的实际基类不同.如何传输模板?

#include <type_traits>

template<typename T, template<typename>class U>
struct Base
{
using type = Base<T,U>;
using devired_type = T;
template<typename V>
using second_tmpl = U<V>;
using second_type = second_tmpl<type>;
};

template<typename T>
struct Template
{
using type = Template<T>;
};

struct Derived
:public Base<Derived,Template>
{
};

//true
static_assert(
std::is_same<
Derived::second_type,
Template<Base<Derived,Template>>>::value,
"false");
//false
static_assert(
std::is_base_of<
Base<Derived,Derived::second_tmpl>,
Derived
>::value,
"false");

template<typename T>
using Template2 = Template<T>;
//false
static_assert(
std::is_same<
Base<Derived,Template>,
Base<Derived,Template2>
>::value,
"false");

使用与原始模板相同的模板代替原始模板。判断错误;

最佳答案

这些是 tempalte 模板参数的限制。

Template template arguments are second-class citizens in C++ :(

第二个断言应该真正阅读

static_assert(std::is_base_of<Base<Derived, Template>, Derived>::value, "false");

哪个可行。

为了解决第三个问题(事实上你“不能输入定义一个打开模板”),让它成为一个元函数:例如在下面的程序中使用 TemplateGen:

Live On Coliru

#include <type_traits>

template <typename T, typename UGen>
struct Base {
using type = Base<T, typename UGen::template type<T> >;
using devired_type = T;

template <typename V> using second_tmpl = typename UGen::template type<T> ;
using second_type = second_tmpl<type>;
};

template <typename T>
struct Template {
using type = Template<T>;
};

struct TemplateGen {
template <typename T> using type = Template<T>;
};

struct Derived : public Base<Derived, TemplateGen> {
};

// true
static_assert(std::is_same<Derived::second_type, Template<Derived> >::value, "false");
// false
static_assert(std::is_base_of<Base<Derived, TemplateGen>, Derived>::value, "false");

using Template2 = TemplateGen;

// false
static_assert(std::is_same<Base<Derived, TemplateGen>, Base<Derived, Template2>>::value, "false");

int main(){}

关于c++ - 如何传输模板?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27108614/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com