首先,我不是真的有问题,但我喜欢尽可能保持简单。
我正在使用名为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); }
};
顺便说一句。对f64
和double
到u32
的类型定义为unsigned int
。
答案 0 :(得分:4)
静态函数应由ClassName::FunctionName
调用。由于ClassName
是模板,因此 必须 指定模板参数。静态函数也可以在一个对象上调用,即object.StaticFunctionName
,所以如果你已经有一个对象,你可以避免指定模板参数,但在我个人的偏见中,调用一个对象的静态函数是丑陋的。
如果我是你,我会做的是在与你的班级相同的命名空间中使该函数成为非成员(模板的朋友,如果需要)。
答案 1 :(得分:2)
无法将函数调用为Math::SeedRandom
(当然,除了使Math
非模板化之外)。您可以做的最好的事情是将SeedRandom
移到一个单独的非模板化课程中,或者只需将其称为Math<whatever>::SeedRandom
。
答案 2 :(得分:0)
我对一个名为“数学”的课程持怀疑态度,因为我发现很难想象一个“数学”的实例。从它的声音来看,您可能希望使用带有一些模板自由函数的命名空间。你遇到这个问题可能表明你可能不应该做你正在做的事情。
C ++是一种多范式语言,因此与Java等语言不同,因此不会强制所有内容成为对象的一部分。