Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/135.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 模板类中的静态非模板函数_C++_Templates_Static - Fatal编程技术网

C++ 模板类中的静态非模板函数

C++ 模板类中的静态非模板函数,c++,templates,static,C++,Templates,Static,首先,我不是真的有问题,但我喜欢让事情尽可能简单。 我正在使用一个名为Math的模板类,除了许多其他内容外,还有随机函数 不同类型的随机函数,以及设置随机种子的函数。因此,除了seed函数外,每个函数都使用类型class Real。但是当我想设置种子时,我必须传递一些随机(哈哈)类型才能调用函数: Math<u32>::SeedRandom(System::time()); Math::SeedRandom(System::time()); 同样,这不是一个真正的问题,但我很好奇

首先,我不是真的有问题,但我喜欢让事情尽可能简单。 我正在使用一个名为
Math
的模板类,除了许多其他内容外,还有随机函数

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

Math<u32>::SeedRandom(System::time());
Math::SeedRandom(System::time());
同样,这不是一个真正的问题,但我很好奇是否有可能在不使用
的情况下获得相同的结果

下面是数学课的一个片段:

template <class Real>
class Math
{
public:
    static void SeedRandom(u32 seed) { srand(seed); }
    static Real UnitRandom() { return (Real)((f64)rand() / (f64)RAND_MAX); }
};
模板
课堂数学
{
公众:
静态空种子随机(u32种子){srand(种子);}
静态实数UnitRandom(){return(Real)((f64)rand()/(f64)rand_MAX);}
};

顺便说一句,
f64
的类型定义为
double
,而
u32
的类型定义为
unsigned int
,没有办法使函数可以调用为
Math::SeedRandom
(当然,使
Math
非模板化除外)。您最好将
SeedRandom
移动到一个单独的、非模板化的类中,或者直接将其称为
Math::SeedRandom

静态函数应该由
ClassName::FunctionName
调用。因为
ClassName
是一个模板,所以必须指定模板参数。静态函数也可以在对象上调用,例如,
object.StaticFunctionName
,因此,如果已经有对象,可以避免指定模板参数,但我个人有偏见地认为,在对象上调用静态函数很难看


如果我是你,我会做的是使函数成为非成员函数(如果需要的话,是模板的朋友),与你的类位于同一名称空间。

我对一个名为“Math”的类非常怀疑,因为我发现很难想象“Math”的实例。听上去,您可能希望将名称空间与一些无模板函数一起使用。你有这个问题可能是一个信号,也许你不应该做你正在做的事情


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

是的,可以使用单例对象调用该函数,但在这种情况下,它确实很难看:)只是想知道是否有方法对其进行编码,因此无需指定类型。我试了一下,可以这样调用它
Math::SeedRandom((u32)System::time())。这至少表明没有使用该类型,但它只会使编译时间不必要地延长,而且它甚至比使用
@v01pe调用更难看:在我反常的偏见观点中,使用
void*
并不意味着没有使用该类型。正如我已经说过的,IMO的独立功能是最好的解决方案。独立函数与C++中的OOP范式没有任何矛盾,我想将其与随机函数保持在同一个类中,但感谢您指出,以另一种方式是不可能的。问题是,该类还包含一些模板化的
const
s,它们在函数内部使用。另外,上面提到的函数是唯一一个不需要模板的函数。我知道这不是最好的方法,也许有一天我会重构它,但现在它完全符合它的目的。