非模板类中的任何类型的C++成员变量
问题描述:
有没有某种方法可以将类或模板中的模板或自动变量存储在模板中?我试图存储一个指向其中一个STL随机数生成器的指针,但我无法想出任何方式来做到这一点,而不需要将整个类放入模板中。这不是一个选项,因为将cpp中的所有内容移到h文件中会导致大量的循环头文件包含我不想处理的内容。因此,例如,它会是这样的:非模板类中的任何类型的C++成员变量
class tSomeClass
{
public:
template<typename RNG>
tSomeClass(RNG * rng) : fRNG(rng) { }
private:
RNG * fRNG; // How do I get this working???
};
到目前为止,一切我来了总是需要有整个班级为模板,所以我难倒结束。
编辑:我知道我忘了提到的东西。我不能使用继承来指定RNG类型,因为我不知道基类是什么,除非有人知道STL使用的RNG的基类是什么。目前我使用std :: default_random_engine。
答
我能想到的两个选项,如果你真的不想要的模板:
- 如果你从字面上的意思是任何类型的,你可以使用
void *
。这不是非常安全的类型,而且类的用户必须确切地知道使用它的实际类型。 - 如果您可以将类型限制为某个基本接口/类,则可以使用指向该类型的指针,例如,
IRandom *
。一般来说,这似乎更有用/可用。
答
安全正确的方法是定义一个描述接口的类并在实际实现中继承它。
实施例:
class RNG {
public:
virtual int get(void) = 0;
}
答
的C的方法是使用一般的指针(void*
),然而,因为这是C++只是利用继承的和动态绑定,即:
class RNG /* random number generator interface/base class */
{
public:
virtual int randomize(void) = 0;
};
class RandomA : public RNG /* one implementation of a random num generator */
{
public:
int randomize() { return 4; }
};
class RandomB : public RNG /* another implementation of a random num generator */
{
public:
int randomize() { return 0; }
};
class tSomeClass
{
public:
tSomeClass(RNG * rng) : fRNG(rng) { }
private:
RNG * fRNG;
};
...
RandomA randomObj;
tSomeClass t(&randomObj);
或者即使是一个函数指针,如果这是你所有的随机数生成器组成的。
+0
如果我知道所有RNG的基类是什么,但是目前我不知道,那就行了。详细更新了问题。 – Shenjoku 2011-12-20 04:31:10
为什么你需要这个模板?会不会正常继承工作? – dasblinkenlight 2011-12-20 04:12:26
¤您可以简单地存储'std :: function '。 Cheers&hth。, – 2011-12-20 04:22:11
您确定要将* ANY *类型储存在RNG中吗?你不能以某种方式限制它吗?我的意思是,你想存储一个指向类的指针,一个指向原始类型的指针等等吗? – Lucian 2011-12-20 06:38:23