Статическая не шаблонная функция в шаблонном классе - PullRequest
5 голосов
/ 10 февраля 2012

Во-первых, у меня на самом деле нет проблем, но мне нравится, чтобы все было как можно проще.Я использую шаблонный класс с именем Math, и помимо множества других вещей есть случайные функции.

Различные типы случайных функций и функция для установки случайного начального числа.Таким образом, каждая функция, кроме функции seed, использует тип class Real.Но когда я хочу установить начальное значение, мне нужно передать какой-то случайный (хаха) тип, чтобы можно было вызвать функцию:

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); }
};

btw.f64 - это typedef'd для double и u32 для unsigned int.

Ответы [ 3 ]

4 голосов
/ 10 февраля 2012

Статические функции должны вызываться ClassName::FunctionName. Поскольку ClassName является шаблоном, вы должны указать аргументы шаблона. Статические функции также можно вызывать для объекта, то есть object.StaticFunctionName, поэтому, если у вас уже есть объект, вы можете избежать указания аргументов шаблона, но, по моему личному пристрастному мнению, вызов статической функции для объекта является уродливым.

Что бы я сделал, если бы вы были на вашем месте, это сделали бы функцию, не являющуюся членом (другом шаблону, если необходимо), в том же пространстве имен, что и ваш класс.

2 голосов
/ 10 февраля 2012

Невозможно сделать функцию вызываемой как Math::SeedRandom (за исключением того, что, конечно, Math не шаблонизирован).Лучшее, что вы можете сделать, - это переместить SeedRandom в отдельный не шаблонный класс или просто назвать его Math<whatever>::SeedRandom.

0 голосов
/ 25 июня 2013

Я очень скептически отношусь к классу под названием "Math", потому что мне трудно представить себе экземпляр "Math". Судя по его звукам, вы можете использовать пространство имен с некоторыми функциями без шаблонов. То, что у вас возникла эта проблема, может быть признаком того, что, возможно, вам не следует делать то, что вы делаете.

C ++ - это мультипарадигмальный язык, и, в отличие от таких языков, как Java, не обязывает все быть частью объекта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...