模板类中的静态非模板化函数

时间:2012-02-10 11:33:38

标签: c++ templates static

首先,我不是真的有问题,但我喜欢尽可能保持简单。 我正在使用名为Math的模板化类,除了很多其他东西外,还有随机函数。

不同类型的随机函数,以及设置随机种子的函数。因此,除种子函数之外的每个函数都使用类型class Real。但是当我想设置种子时,我必须传递一些随机(haha)类型才能调用该函数:

Math<u32>::SeedRandom(System::time());

同样,这不是一个真正的问题,但我很好奇是否可以在不需要使用<u32>的情况下获得相同的结果。

这是Math类的一个片段:

template <class Real>
class Math
{
public:
    static void SeedRandom(u32 seed) { srand(seed); }
    static Real UnitRandom() { return (Real)((f64)rand() / (f64)RAND_MAX); }
};

顺便说一句。对f64doubleu32的类型定义为unsigned int

3 个答案:

答案 0 :(得分:4)

静态函数应由ClassName::FunctionName调用。由于ClassName是模板,因此 必须 指定模板参数。静态函数也可以在一个对象上调用,即object.StaticFunctionName,所以如果你已经有一个对象,你可以避免指定模板参数,但在我个人的偏见中,调用一个对象的静态函数是丑陋的。

如果我是你,我会做的是在与你的班级相同的命名空间中使该函数成为非成员(模板的朋友,如果需要)。

答案 1 :(得分:2)

无法将函数调用为Math::SeedRandom(当然,除了使Math非模板化之外)。您可以做的最好的事情是将SeedRandom移到一个单独的非模板化课程中,或者只需将其称为Math<whatever>::SeedRandom

答案 2 :(得分:0)

我对一个名为“数学”的课程持怀疑态度,因为我发现很难想象一个“数学”的实例。从它的声音来看,您可能希望使用带有一些模板自由函数的命名空间。你遇到这个问题可能表明你可能不应该做你正在做的事情。

C ++是一种多范式语言,因此与Java等语言不同,因此不会强制所有内容成为对象的一部分。