c++静态多态性/CRTP,带有访问基类成员的附加模板参数

标签 c++ templates static-polymorphism

我想使用 CRTP 实现静态多态性并向模板参数添加其他类型。

提供如下场景,如何直接访问Derived类的Base成员?是否可以不指定基类的完整类型?

#include <iostream>

template<class Derived, class X>
struct Base
{
    void set_a( int a ) { _a = a; }
    protected:
        int _a;
};

template<class X>
struct Derived: public Base<Derived<X>, X>
{
    int get_a( )
    {
        // return Base<Derived<X>,X>::_a; // This works!
        return _a; // error: use of undeclared identifier '_a'
    }
};

struct foo;

int main()
{
    Derived<foo> test;

    auto base_p = static_cast< Base<Derived<foo>, foo>* >( &test );
    base_p->set_a( 42 );

    int a = test.get_a();
    std::cout << a << std::endl;
}

g++5.3.1/clang++3.8.0 输出:

error: use of undeclared identifier '_a'

最佳答案

你可以在你的类中添加一个using声明:

template<class X>
struct Derived: public Base<Derived<X>, X> {

  using Base<Derived<X>, X>::_a;

  /* ... */

};

不过你仍然需要指定一次。

关于c++静态多态性/CRTP,带有访问基类成员的附加模板参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38351536/

相关文章:

c++ - CRTP - 是否可以创建一个抽象基类?

c++ - 具有转发引用的静态多态性

c++ - 在 C++11 中实现自定义迭代器

c++ - 在x86_64上加载/存储原子双浮点或SSE/AVX vector

c++ - 为什么我不能在 C++ 的函数中使用 outf

c++ - 完全专用模板中构造函数的外线定义

django - 如何模仿django admin的OneToOneField可选表单

c++ - 将多种类型的模板化类存储到容器中

c++ - 我正在尝试对运算符 '+'进行二进制重载,但输出错误,我不明白为什么?

c++ - 静态多态性对实现接口(interface)有意义吗?