C++ 基于继承关系的模板友谊
我不确定这是否可以实现。假设我有两个类模板C++ 基于继承关系的模板友谊,c++,templates,c++11,c++14,C++,Templates,C++11,C++14,我不确定这是否可以实现。假设我有两个类模板Foo和FooOwner,并且FooOwner有一个指向Foo的指针成员,其中U是T的子类 我想让FooOwner成为Foo的朋友,但前提是U是T的子类。可能吗?如果没有,是否有足够接近的解决方法 template<typename T> class FooOwner { private: Foo<T>* p; // This can point to a object of type Foo<U>
Foo
和FooOwner
,并且FooOwner
有一个指向Foo
的指针成员,其中U
是T
的子类
我想让FooOwner
成为Foo
的朋友,但前提是U
是T
的子类。可能吗?如果没有,是否有足够接近的解决方法
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;
};
模板
类食品所有者{
私人:
Foo*p;//这可以指向Foo类型的对象
//其中U是T的一个子类
};
//注意:Foo始终是Foo的一个子类
模板
福班{
私人:
模板//约束U为T的超类?
朋友类食物拥有者;
};
我不确定您想要达到什么目标,但也许类型特征可以帮助您:
#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
}
#包括
A类{};
B类:A{};
C类{};
int main()
{
std::是以下各项的基础:
std::conditional由于FooOwner
似乎不是Foo外部接口的一部分,您可以在Foo
中声明它:
template<typename T>
class Foo {
private:
template<typename U> // Constrain U to be a superclass of T?
friend class FooOwner;
template< typename U>
class FooOwner {
public:
FooOwner(std::enable_if<std::is_base_of<T, U>::value, U*> uptr) : p(uptr){} // (rough idea)
private:
Foo<U>* p; // This can point to a object of type Foo<U>
// where U is a subclass of T
};
};
如果您想将FooOwner保持在Foo的外部,您可以以类似的方式使其成为U
和T
的模板。您的意思是FooOwner有两个类型参数吗?template FooOwner
。\U堆栈否,它只知道T
,并且依赖于T
作为多态类型才能正常工作。它是这与我们如何将std::unique\U ptr
指向派生的类型的对象基本相同。你的描述和你的代码之间存在差异。根据描述FooOwner
中p
的类型应该是Foo*
。但是,你从哪里获得U
类型呢?@Leon我应该说“有一个Foo
类型的指针,它实际上可以指向Foo
类型的对象,其中U
是T
的一个子类。”一般来说,Foo
指针不能合法地指向Foo
对象,因为Foo
和Foo
之间没有继承关系(即使U
是T
的子类)。这只有在专门化Foo
时才有可能。是这样吗?
std::enable_if<std::is_base_of<A, B>::value, A>::type
// will be defined only if B is derived from A
template<typename T>
class Foo {
private:
template<typename U> // Constrain U to be a superclass of T?
friend class FooOwner;
template< typename U>
class FooOwner {
public:
FooOwner(std::enable_if<std::is_base_of<T, U>::value, U*> uptr) : p(uptr){} // (rough idea)
private:
Foo<U>* p; // This can point to a object of type Foo<U>
// where U is a subclass of T
};
};
template<typename T>
class Foo {
private:
template<typename U, typename = std::enable_if<std::is_base_of<T, U>::value>>
friend class FooOwner;
template<typename U, typename = std::enable_if<std::is_base_of<T, U>::value>>
class FooOwner {
private:
Foo<U>* p; // This can point to a object of type Foo<U>
// where U is a subclass of T
};
};
template<typename U, typename = T>
class FooOwner {
. . .
};