【发布时间】:2013-05-12 20:48:02
【问题描述】:
这一直在我的脑海中作为一个问题的可能解决方案,但是由于它在 C++ 中是对 something 的相当明显的技术违规,我想知道它失败的可能性有多大,是否有另一种相当明显的方法,等等。我希望这不会引发关于未定义行为的激烈争吵,但考虑到这个话题,我确实有点期待。
这不是我正在编写的代码,我希望它不会过于简化以至于无法描述我正在尝试做的事情。
class Code
{
public:
bool read(short slot, short& val);
bool read(short slot, long& val);
bool read(short slot, double& val);
// etc
protected:
unsigned char* m_data;
};
typedef boost::shared_ptr<Code> CodePtr;
class SortedBase
{
protected:
class Sorter : public std::binary_function<CodePtr,CodePtr,bool>
{
protected:
inline Sorter() {}
virtual ~Sorter() {}
public:
virtual bool operator()(CodePtr left, CodePtr right) PURE;
};
inline SortedBase(Sorter* s):m_codeList(s) {}
typedef std::set<CodePtr,Sorter> TSortedCode;
TSortedCode m_codeList;
public:
virtual ~SortedBase() {}
void fetch(); // populates m_codeList
};
template<class SORT1, class SORT2, class SORT3, class SORT4, class SORT5>
class SortedObject5 : public SortedBase
{
public:
SortedObject5():SortedBase(m_sorter),m_sorter(this) {}
something_interesting find(SORT1 val1, SORT2 val2, SORT3 val3, SORT4 val4, SORT5 val5);
protected:
typedef SortedObject5<SORT1,SORT2,SORT3,SORT4,SORT5> my_class;
class MySorter : public Sorter
{
public:
MySorter(const my_class& parent):m_parent(parent) {}
virtual operator()(CodePtr left, CodePtr right);
protected:
const my_class& m_parent;
}
MySorter m_sorter;
};
这里的意图
我在编写模板类时经常发现,具有尽可能多的分解逻辑的非模板基类对于拥有一些其他代码可以引用的公共类和减少代码重复量很有用,尤其是当使用不同数量的模板参数制作同一类的五个不同版本时。
在这种情况下,CodePtr 是在代码的其他地方生成的(尽管我确实编写了它),我想根据任意数量的任意数据类型查找元素。起初我考虑了一个 std::multimap,但密钥最终将再次成为 CodePtr 的包装器(或重要块的副本)。
问题
我将有状态排序器仿函数 SortedObject5::my_sorter 传递给 SortedBase::m_codeList 的构造函数。然而,由于有状态的排序器在子类中,显然不是在构造 STL 集的时候构造的。
我想知道如果我不从任何一个构造函数在 m_codeList 中进行任何插入或搜索,这是否是一个问题。
有状态分拣机免责声明
我正式断言() 任何有状态排序仿函数使用的规则只会在它控制的 STL 容器为空或不久之后被 clear() 时更改。
【问题讨论】:
-
我从来没有详细研究过,但是Boost的
base_from_member对你有帮助吗? -
嗯,好吧?哈哈。该技术可能是一种好方法,它肯定解决了类似(如果不相同)的问题。可能需要进行一些研究才能看到我是否可以使用他们打包的模板,或者我是否被困在我的班级人数翻倍。所以简而言之,该页面中描述的技术是一个潜在的答案。
-
你的班级人数加倍?嗯?您需要一个额外的类来实现成员习语的基础。把它做成一个模板,它可以被任何类型重用。
-
除非排序器类本身是一个模板类,在这种情况下就是这样。这意味着将模板类一分为二,一个实现排序器的基类和一个将两者连接在一起的子类。我计划在这里有 4-5 个模板,参数数量不等。
标签: c++ stl construction