【问题标题】:Static non templated function in templated class模板类中的静态非模板函数
【发布时间】:2012-03-02 21:12:36
【问题描述】:

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

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

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

同样,这不是一个真正的问题,但我很好奇是否有可能在不需要使用 &lt;u32&gt; 的情况下获得相同的结果。

这里有一个数学类的 sn-p:

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

顺便说一句。 f64 被定义为 doubleu32unsigned int

【问题讨论】:

    标签: c++ templates static


    【解决方案1】:

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

    如果我是你,我会做的是将函数设为非成员函数(如果需要,是模板的朋友),与你的类在同一个命名空间中。

    【讨论】:

    • 是的,调用该函数的单例对象是可能的,但在这种情况下,它真的很难看 :) 只是想知道是否有一种编码方法,所以不需要指定类型。我试了一下,可以这样称呼它Math&lt;void*&gt;::SeedRandom((u32)System::time());。这至少表明该类型没有被使用,但它只会不必要地延长编译时间,而且它比使用&lt;sometype&gt; 调用更难看。
    • @v01pe: 在我的变态偏见中使用void* 绝不意味着没有使用该类型。 IMO,正如我已经说过的,独立功能是最好的解决方案。独立函数与 C++ 中的 OOP 范式没有任何矛盾
    【解决方案2】:

    没有办法让函数可以作为Math::SeedRandom 调用(当然Math 是非模板化的除外)。您可以做的最好的事情是将SeedRandom 移动到一个单独的非模板类中,或者直接将其称为Math&lt;whatever&gt;::SeedRandom

    【讨论】:

    • 我想把它和随机函数放在同一个类中,但是感谢你指出用其他方式是不可能的。
    【解决方案3】:

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

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

    【讨论】:

    • 问题是,该类还包含一些模板化的consts,它们在函数内部使用。另外我上面提到的功能是唯一的功能,不需要模板。我知道这不是最好的方法,我可能会在某一天重构它,但现在它完全可以达到它的目的。
    猜你喜欢
    • 1970-01-01
    • 2012-09-28
    • 2012-03-09
    • 2012-05-22
    • 2010-12-20
    • 1970-01-01
    • 1970-01-01
    • 2011-06-07
    • 1970-01-01
    相关资源
    最近更新 更多