c++ - 基于继承关系的模板友情

标签 c++ templates c++11 c++14

我不确定这是否可以实现。假设我有两个类模板 Foo<T>FooOwner<T> , 和一个 FooOwner<T>有一个指向 Foo<U> 的指针成员, 其中UT 的子类.

我想制作FooOwner<T> Foo<U>的 friend , 但前提是 UT 的子类.那可能吗?如果不是,是否有足够接近的解决方法?

template<typename T>
class FooOwner {
private:
    Foo<T>* p;  // This can point to a object of type Foo<U>
                // where U is a subclass of T
};

// NOTE: Foo<Derived> is always a subclass of Foo<Base>

template<typename T>
class Foo {
private:
    template<typename U>  // Constrain U to be a superclass of T?
    friend class FooOwner;
};

最佳答案

我不确定你想要实现什么,但也许是类型特征 is_base_of可以帮助你:

#include <type_traits>

class A {};

class B : A {};

class C {};

int main() 
{
    std::is_base_of<A, B>::value; // true
    std::is_base_of<C, B>::value; // false
}

您可以将它与 conditional 一起使用:

std::conditional<std::is_base_of<A, B>::value, A, SomethingElse>::type
  // will be A if B is derived from A, or SomethingElse otherwise

或用enable_if :

std::enable_if<std::is_base_of<A, B>::value, A>::type
  // will be defined only if B is derived from A

关于c++ - 基于继承关系的模板友情,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38539430/

相关文章:

c++ - Mac OS X 上的 RInside

将函数传递给 remove_if 时出现 C++ 编译错误

c++ - 如何停止检查可变参数

c++ - 成员模板和继承

c++ - 如何使用另一个类作为类模板特化

c++ - 为什么模板函数调用不明确?

c++ - 如何为包含 map<int,*double> 成员的类编写析构函数?

c++ - GetProcAddress 函数返回 NULL

c++ - 允许在派生类上使用流运算符

c++ - 尝试理解编译器错误信息 : default member initializer required before the end of its enclosing class