gpt4 book ai didi

c++ - C++静态多态性(CRTP)并使用派生类中的typedef

转载 作者:行者123 更新时间:2023-12-02 10:34:36 24 4
gpt4 key购买 nike

我读了Wikipedia article,它了解C++中用于执行静态(阅读:编译时)多态性的奇怪重复模板模式。我想对其进行概括,以便可以基于派生类型更改函数的返回类型。 (由于基本类型从template参数知道派生类型,因此这似乎应该可行)。不幸的是,以下代码无法使用MSVC 2010进行编译(我现在无法轻松访问gcc,因此我还没有尝试过)。有人知道为什么吗?

template <typename derived_t>
class base {
public:
typedef typename derived_t::value_type value_type;
value_type foo() {
return static_cast<derived_t*>(this)->foo();
}
};

template <typename T>
class derived : public base<derived<T> > {
public:
typedef T value_type;
value_type foo() {
return T(); //return some T object (assumes T is default constructable)
}
};

int main() {
derived<int> a;
}

顺便说一句,我有一个使用额外模板参数的解决方法,但是我不喜欢它-当在继承链中传递许多类型时,它将变得非常冗长。
template <typename derived_t, typename value_type>
class base { ... };

template <typename T>
class derived : public base<derived<T>,T> { ... };

编辑:

MSVC 2010在这种情况下给出的错误消息是 error C2039: 'value_type' : is not a member of 'derived<T>'
g++ 4.1.2(通过 codepad.org)说 error: no type named 'value_type' in 'class derived<int>'

最佳答案

当您将derived用作其基类列表中base的模板参数时,它是不完整的。

常见的解决方法是使用特征类模板。这是您的示例,特征化。这显示了如何通过特征使用派生类中的类型和函数。

// Declare a base_traits traits class template:
template <typename derived_t>
struct base_traits;

// Define the base class that uses the traits:
template <typename derived_t>
struct base {
typedef typename base_traits<derived_t>::value_type value_type;
value_type base_foo() {
return base_traits<derived_t>::call_foo(static_cast<derived_t*>(this));
}
};

// Define the derived class; it can use the traits too:
template <typename T>
struct derived : base<derived<T> > {
typedef typename base_traits<derived>::value_type value_type;

value_type derived_foo() {
return value_type();
}
};

// Declare and define a base_traits specialization for derived:
template <typename T>
struct base_traits<derived<T> > {
typedef T value_type;

static value_type call_foo(derived<T>* x) {
return x->derived_foo();
}
};

您只需要对 base_traits模板参数 derived_t所使用的任何类型的 base进行特殊化,并确保每种特殊化都提供 base所需的所有成员。

关于c++ - C++静态多态性(CRTP)并使用派生类中的typedef,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60960992/

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