我觉得之前已经问过这个问题,但我无法在SO上找到它,也无法在Google上找到任何有用的信息.也许"covariant"不是我正在寻找的词,但这个概念与函数的协变返回类型非常相似,所以我认为它可能是正确的.这是我想要做的,它给了我一个编译器错误:
class Base;
class Derived : public Base;
SmartPtr<Derived> d = new Derived;
SmartPtr<Base> b = d; // compiler error
Run Code Online (Sandbox Code Playgroud)
假设这些课程充分充实......我想你明白了.它不能转换SmartPtr<Derived>成SmartPtr<Base>某种不明原因.我记得在C++和许多其他语言中这是正常的,虽然目前我不记得为什么.
我的根本问题是:执行此赋值操作的最佳方法是什么?目前,我正在将指针拉出,将其SmartPtr明确地向上转换为基类型,然后将其包装为新SmartPtr的适当类型(请注意,这不会泄漏资源,因为我们的本地SmartPtr类使用侵入式引用计数).那是漫长而凌乱的,尤其是当我需要将SmartPtr另一个对象包裹起来时...任何快捷方式?
首先,我定义了两个相互继承的类.
class A {
};
class B : public A {
};
Run Code Online (Sandbox Code Playgroud)
然后,我声明一个使用以下函数的函数std::function<void(A*)>:
void useCallback(std::function<void(A*)> myCallback);
最后,我std::function从我想要在回调函数中使用的其他地方收到一个不同的(但理论上兼容的)类型:
std::function<void(B*)> thisIsAGivenFunction;
useCallback(thisIsAGivenFunction);
Run Code Online (Sandbox Code Playgroud)
我的编译器(clang ++)拒绝这个,因为它的类型thisIsAGivenFunction与期望的类型不匹配.但是B继承自己A,接受它是有道理的thisIsAGivenFunction.
应该是吗?如果没有,为什么?如果它应该,那么我做错了什么?
我有以下不编译的代码.
class Base {
public:
virtual ~Base() { };
};
class Derived : public Base { };
class NotDerived { };
template <typename T>
class Group { };
int main() {
Group<Base> *g = NULL;
g = new Group<Base>(); // Works
g = new Group<Derived>(); // Error, but I want it to work
g = new Group<NotDerived>(); // Error, as expected
}
Run Code Online (Sandbox Code Playgroud)
我知道这不会编译,因为它g是一种不同的类型Group<Derived>.为了在Java中工作,我会做一些事情Group<? extends Base> g,但据我所知,C++没有那个关键字.可以做些什么?
编辑:我想澄清,我不希望它可以设置不从派生类型Base的g.我已经更新了我的例子来解释这一点.
编辑2:我的问题有两个解决方案. 戴夫的发现简单易行.但 …
我希望能够传递从DBMetaData另一个类的非类型模板参数继承的对象的引用,DBVar:
#include <iostream>
class DBMetaData
{
public:
virtual const char *description( ) const = 0;
};
class DBMetaData_NT
: public DBMetaData
{
public:
const char *description( ) const
{ return "Useless description."; }
};
#if DO_WHAT_I_WANT
template< const DBMetaData &Metadata >
#else
template< typename MetadataType,
const MetadataType &Metadata >
#endif // DO_WHAT_I_WANT
class DBVar
{
public:
/// Descrição da variavel.
const char *description( ) const
{ return Metadata.description( ); }
};
DBMetaData_NT _md_u1;
#if DO_WHAT_I_WANT
DBVar< …Run Code Online (Sandbox Code Playgroud) 你能在C++中使用协方差适用于泛型类型(通过模板)吗?
我已经发现这个问题回答了我的问题,但我再次问它,因为它已经有两年了!虽然有人解释说模板中的C++中没有协方差,但没有解释!
你能帮我讲解这个话题的新闻/解释吗?
我已经检查了一段时间的内联网,并找到了我的问题的任何答案.我想知道C++是否支持有界多态性和/或F-有界多态性.
例如,在Java程序员中可以做到这一点(boundedn polymorphism):
<T extends Car> void startEngine(T c) {/*body method*/}
Run Code Online (Sandbox Code Playgroud)
这个(F-有界多态性):
<T extends Comparable<T>> void compareWith(T c) {/*body method*/}
Run Code Online (Sandbox Code Playgroud)
在C++中有什么相同的东西吗?
谢谢!
我有一个练习,其中我必须使用模板类“Garage”,该类将“汽车”或“自行车”作为参数。很简单,但我不断收到错误,因为我显然对模板的理解不够好。这是 :
template<class Car>
class Garage{
Car array[10];
public:
void addCar(int counter1);
void removeCar(int counter1);
void displayContents(int counter1);
};
template<class Motorbike>
class Garage{
Motorbike array[10];
public:
void addMotorbike(int counter2);
void removeMotorbike(int counter2);
void displayContents(int counter2);
};
Run Code Online (Sandbox Code Playgroud)
恰当的 ?我是否必须在类的每个函数前面插入模板?该程序当然包含更多的类和函数,但它是我需要在头脑中整理出来的模板。感谢您抽出宝贵的时间。