这是一个玩具示例,说明了我遇到的问题.该应用程序相当无关紧要(它本质上是一个链接的元素列表,最后有一个特殊的行为).我无法使用派生指针构造基类shared_ptr,并且由于某种原因链接到我正在使用私有继承的事实.
#include <iostream>
#include <boost/shared_ptr.hpp>
#include <boost/make_shared.hpp>
using namespace std;
// An Item in a linked list
class A
{
public:
//friend class B;
typedef boost::shared_ptr<A> APtr;
A() : next_() {}
A(APtr n) : next_(n) {}
APtr next() { return next_; }
void setNext(APtr n) { next_ = n; }
virtual void doIt() { /* standard behavior */ }
private:
APtr next_;
};
class B : private A // B really is a special A
// that should have different …Run Code Online (Sandbox Code Playgroud) 我遇到了一个设计问题,其中(在C++中)我想要一个模板化的成员函数(非模板类)是虚拟的,我想知道是否有一个好的,优雅的方法围绕这个问题.
场景去,我的机器是处理一般的物品.我为具有虚拟进程(Item)功能的机器使用抽象基类,以便每台机器都可以定义自己独特的处理方法.问题是这些项目也是"通用的",因为它们暴露了某些接口以便如何处理它们.由于原因(主要是为了性能......没有vtable开销),我想对这些项使用编译时多态.所以现在每台机器都有一个如下界面:
class Machine
{ public:
template <typename T>
virtual void process(T& item) = 0;
};
Run Code Online (Sandbox Code Playgroud)
但是在C++中这是不可能的,因为模板化的成员函数不能是虚拟的.当然我可以在Item类型T上模拟机器类,但是这会在更大的设计方案中为我增加更多的麻烦,而且Machine类的其他任何部分都不依赖于Item ...它只是process()函数的一个参数.
有没有更好的方法围绕这个或任何建议如何提供这种通用系列的机器来处理一系列通用项目(其中项目使用编译时多态).在我的设计方面,我是否已经走到了尽头.
感谢任何建议
似乎C++ STL容器要求提供的分配器类型的value_type与STL容器的value_type相同
要求:allocator_- type :: value_type与X :: value_type相同.
但是,以下使用字符串向量但带有双精度分配器的代码在VS 2012和g ++ 4.4.7上运行正常.在g ++上,valgrind也不会产生任何错误.
int main()
{
typedef vector<std::string, std::allocator<double> > StringList;
StringList s;
for(int i=0; i < 100; i++){
stringstream ss;
ss << i;
s.push_back(ss.str());
}
for(StringList::iterator it = s.begin(); it != s.end(); ++it)
{
cout << *it << " ";
}
cout << endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我假设分配器正在内部反弹到容器的value_type的分配器(虽然可能我错了).
我的问题是我误读了C++规范,实际上所有容器都会"重新绑定"提供的分配器以使用他们想要的类型吗?或者这只是一种常见的做法,但不能保证.
基本上我可以依靠这个"功能",容器将始终采用我提供的任何分配器(任何类型)并使其适用于该容器的value_type?
在C++中提供接口的最优雅方式是什么,它接受带有不同数据类型成员的派生类类型,然后需要在后面检索它们.下面的示例说明了这一点,其中Container类提供了"发布"Item的方法,该Item将是某种BaseItem的派生变体.稍后我想要获取派生的Item并提取其值.
我想要的主要是Container接口(post和receive)在将来保持不变,同时允许定义和"传递"不同的"Item"派生类型.模板会不会以某种方式变得更好; 我宁愿不使用RTTI.也许有一些简单,优雅的答案,但现在我正在努力想到它.
class ItemBase {
// common methods
};
class ItemInt : public ItemBase
{
private:
int dat;
public:
int get() { return dat; }
};
class ItemDouble : public ItemBase
{
private:
double dat;
public:
double get() { return dat; }
};
class Container {
public:
void post(int postHandle, ItemBase *e);
ItemBase* receive(int handle); // Returns the associated Item
};
int main()
{
ItemInt *ii = new IntItem(5);
Container c;
c.post(1, ii);
ItemInt *jj = c.receive(1);
int val …Run Code Online (Sandbox Code Playgroud) 我在C++中编写一个简单的容器类,类似于存储由键索引的对象的映射.我想提供一个访问器功能,例如:
V& getValue(const K &key);
Run Code Online (Sandbox Code Playgroud)
我在哪里返回对值的引用.
但我也想处理键/值不存在的情况,并能够将某些状态返回给用户(可能有一些原因导致我不想通过某种状态类型与调用者通信).
我想我可以执行以下操作,但调用此方法需要在调用此函数之前构造V对象,并且我只是将内部V对象复制到通过引用传入的对象中,这样看起来很糟糕.
Status getValue(const K &key, V& v);
Run Code Online (Sandbox Code Playgroud)
我也可以这样做:
V &getValue(const K &key, Status &s);
Run Code Online (Sandbox Code Playgroud)
但出于某种原因,这似乎有点笨拙,因为焦点被从状态中吸走,用户可能忘记检查它(但也许这不是我的问题).
所以无论如何都有类似的功能
Status getValue(const K &key, V& v);
Run Code Online (Sandbox Code Playgroud)
在调用之前不需要构造虚拟V对象?您无法传递对引用的引用.我想我可以使用指针并且很乐意这样做,但是创建一个简单的使用和推理功能是不太可取的.
有什么想法吗?
是否可以使用C++中的智能指针创建循环双向链表
struct Node {
int val;
shared_ptr<Node> next;
weak_ptr prev;
};
shared_ptr<Node> head;
Run Code Online (Sandbox Code Playgroud)
但是这将有一个共享指针的循环引用,因此不能正确释放.
c++ ×6
allocator ×1
containers ×1
derived ×1
inheritance ×1
parameters ×1
reference ×1
shared-ptr ×1
stl ×1
templates ×1
virtual ×1