MSVC-11.0 и type deduction в шаблонных функциях
От: FrozenHeart  
Дата: 19.02.14 18:20
Оценка:
Здравствуйте.

Имеется следующий код:

template <
  typename RangeType
  , typename RngType = std::mt19937
  , typename DistributionType = std::uniform_int_distribution<RangeType>
>
class get_random_number
{
public:
  typename RngType::result_type operator()(RangeType range_start, RangeType range_end)
  {
    std::random_device rd;
    RngType gen(rd());
    DistributionType dist(range_start, range_end);
    return dist(gen);
  }
};


Использовать его на данный момент можно, например, следующим образом:

#include <iostream>

int main()
{
  for (int i = 0; i < 50; ++i)
  {
    std::cout << get_random_number<int>()(0, 100) << '\n';
  }
}


Можно ли как-то избавиться от необходимости явно указывать тип передаваемых аргументов и воспользоваться type deduction? Проблема в том, что данный код необходимо компилировать, помимо всего прочего, в MSVC-11.0, который не разрешает использовать аргументы по умолчанию в шаблонных функциях.
avalon/1.0.434
Re: MSVC-11.0 и type deduction в шаблонных функциях
От: MT-Wizard Украина  
Дата: 19.02.14 19:06
Оценка:
Здравствуйте, FrozenHeart, Вы писали:

FH>Здравствуйте.


FH>Имеется следующий код:


FH>[ccode]...


FH>Можно ли как-то избавиться от необходимости явно указывать тип передаваемых аргументов и воспользоваться type deduction? Проблема в том, что данный код необходимо компилировать, помимо всего прочего, в MSVC-11.0, который не разрешает использовать аргументы по умолчанию в шаблонных функциях.


Можно перенести параметры шаблона из типа класса в его operator()
При вызове функции компилятор делает автовывод.
А ти, москалику, вже приїхав (с)
Re[2]: MSVC-11.0 и type deduction в шаблонных функциях
От: FrozenHeart  
Дата: 19.02.14 19:50
Оценка:
MTW> Можно перенести параметры шаблона из типа класса в его operator()
MTW> При вызове функции компилятор делает автовывод.

Вы об этом?

class get_random_number
{
public:
  template <
    typename RangeType
    , typename RngType = std::mt19937
    , typename DistributionType = std::uniform_int_distribution<RangeType>
  >
  typename RngType::result_type operator()(RangeType range_start, RangeType range_end)
  {
    std::random_device rd;
    RngType gen(rd());
    DistributionType dist(range_start, range_end);
    return dist(gen);
  }
};


Если да, то я же сказал:

Проблема в том, что данный код необходимо компилировать, помимо всего прочего, в MSVC-11.0, который не разрешает использовать аргументы по умолчанию в шаблонных функциях


Например, вышеприведённый код при попытке компиляции при помощи MSVC-11.0 выдаёт следующую ошибку:

error C4519: default template arguments are only allowed on a class template

avalon/1.0.434
Re: MSVC-11.0 и type deduction в шаблонных функциях
От: niXman Ниоткуда https://github.com/niXman
Дата: 19.02.14 20:08
Оценка:
Здравствуйте, FrozenHeart, Вы писали:

FH> std::random_device rd;

FH> RngType gen(rd());

весьма неразумное решение — конструкторы тяжелые. пробовал.
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[2]: MSVC-11.0 и type deduction в шаблонных функциях
От: FrozenHeart  
Дата: 19.02.14 20:14
Оценка:
X> весьма неразумное решение — конструкторы тяжелые. пробовал.

Это в какой реализации?
avalon/1.0.434
Re[3]: MSVC-11.0 и type deduction в шаблонных функциях
От: niXman Ниоткуда https://github.com/niXman
Дата: 19.02.14 20:16
Оценка:
Здравствуйте, FrozenHeart, Вы писали:

FH>Это в какой реализации?

в стандартной.
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[4]: MSVC-11.0 и type deduction в шаблонных функциях
От: FrozenHeart  
Дата: 19.02.14 20:20
Оценка:
X> в стандартной.

В смысле? В стандарте так написано?

И что можете предложить вместо этого?
avalon/1.0.434
Re[5]: MSVC-11.0 и type deduction в шаблонных функциях
От: niXman Ниоткуда https://github.com/niXman
Дата: 19.02.14 20:31
Оценка:
Здравствуйте, FrozenHeart, Вы писали:

FH>В смысле? В стандарте так написано?

почитай реализацию используемой тобою стандартной библиотеки, и все встанет на места.

FH>И что можете предложить вместо этого?

создавай их в конструкторе твоего get_random_number.
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re: MSVC-11.0 и type deduction в шаблонных функциях
От: andyp  
Дата: 19.02.14 22:57
Оценка:
Немного не в тему, но, может будет полезно:

На мой взгляд параметризовать по типу движка особо смысла не имеет. Нужно просто определиться, какой генератор нужен. Mersenne twister — хороший выбор, если нужно реально МНОГО случайных чисел. Создавать движок имеет смысл статически, так как все твистеры Мерсенна, которые видел, использовали кэширование — генерировали числа пачками и отдавали по требованию. Для каждого типа из использованных распределений лучше создать свой враппер. Все они могут использовать один движок.

Т.е. вместо get_random_number лучше иметь get_uniform_random_number и т.п.
Re: MSVC-11.0 и type deduction в шаблонных функциях
От: antropolog  
Дата: 20.02.14 03:19
Оценка:
Здравствуйте, FrozenHeart, Вы писали:

FH>Можно ли как-то избавиться от необходимости явно указывать тип передаваемых аргументов и воспользоваться type deduction?

да, можно, написав свободную шаблонную функцию. Класс здесь не нужен.
Re[2]: MSVC-11.0 и type deduction в шаблонных функциях
От: FrozenHeart  
Дата: 20.02.14 05:02
Оценка:
a> да, можно, написав свободную шаблонную функцию. Класс здесь не нужен.

Отвечал рядом.

Вы об этом?

class get_random_number
{
public:
  template <
    typename RangeType
    , typename RngType = std::mt19937
    , typename DistributionType = std::uniform_int_distribution<RangeType>
  >
  typename RngType::result_type operator()(RangeType range_start, RangeType range_end)
  {
    std::random_device rd;
    RngType gen(rd());
    DistributionType dist(range_start, range_end);
    return dist(gen);
  }
};


Если да, то я же сказал:

Проблема в том, что данный код необходимо компилировать, помимо всего прочего, в MSVC-11.0, который не разрешает использовать аргументы по умолчанию в шаблонных функциях


Например, вышеприведённый код при попытке компиляции при помощи MSVC-11.0 выдаёт следующую ошибку:

error C4519: default template arguments are only allowed on a class template

avalon/1.0.434
Re[3]: MSVC-11.0 и type deduction в шаблонных функциях
От: k.o. Россия  
Дата: 20.02.14 05:49
Оценка: +1
Здравствуйте, FrozenHeart, Вы писали:

MTW>> Можно перенести параметры шаблона из типа класса в его operator()

MTW>> При вызове функции компилятор делает автовывод.

FH>Вы об этом?

  Скрытый текст
FH>
FH>class get_random_number
FH>{
FH>public:
FH>  template <
FH>    typename RangeType
FH>    , typename RngType = std::mt19937
FH>    , typename DistributionType = std::uniform_int_distribution<RangeType>
  >>
FH>  typename RngType::result_type operator()(RangeType range_start, RangeType range_end)
FH>  {
FH>    std::random_device rd;
FH>    RngType gen(rd());
FH>    DistributionType dist(range_start, range_end);
FH>    return dist(gen);
FH>  }
FH>};
FH>

FH>Если да, то я же сказал:

FH>

Проблема в том, что данный код необходимо компилировать, помимо всего прочего, в MSVC-11.0, который не разрешает использовать аргументы по умолчанию в шаблонных функциях



FH>Например, вышеприведённый код при попытке компиляции при помощи MSVC-11.0 выдаёт следующую ошибку:


FH>

error C4519: default template arguments are only allowed on a class template



template <
    typename RngType = std::mt19937
    , template<class> class DistributionType = std::uniform_int_distribution
>
class get_random_number
{
public:
  template <typename RangeType>
  typename RngType::result_type operator()(RangeType range_start, RangeType range_end)
  {
    std::random_device rd;
    RngType gen(rd());
    DistributionType<RangeType> dist(range_start, range_end);
    return dist(gen);
  }
};
Re[3]: MSVC-11.0 и type deduction в шаблонных функциях
От: MT-Wizard Украина  
Дата: 20.02.14 08:05
Оценка:
Здравствуйте, FrozenHeart, Вы писали:

FH>Например, вышеприведённый код при попытке компиляции при помощи MSVC-11.0 выдаёт следующую ошибку:


FH>

error C4519: default template arguments are only allowed on a class template


Так зачем же бросаться в крайности и переносить сразу всё?

template <
  typename RngType = std::mt19937
  , template <typename> class DistributionType = std::uniform_int_distribution
>
class get_random_number
{
public:
  template <
    typename RangeType
  >
  typename RngType::result_type operator()(RangeType range_start, RangeType range_end)
  {
    std::random_device rd;
    RngType gen(rd());
    DistributionType<RangeType> dist(range_start, range_end);
    return dist(gen);
  }
};

...

get_random_number<>()(1, 2);


P.S. И да, конструкторы генератора и девайса в msvc std очень даже тормозят
А ти, москалику, вже приїхав (с)
Re[4]: MSVC-11.0 и type deduction в шаблонных функциях
От: niXman Ниоткуда https://github.com/niXman
Дата: 20.02.14 12:21
Оценка: 1 (1)
Здравствуйте, MT-Wizard, Вы писали:

MW>P.S. И да, конструкторы генератора и девайса в msvc std очень даже тормозят

и в libstdc++, и в libc++ — т.е. везде, что неудивительно.
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[5]: MSVC-11.0 и type deduction в шаблонных функциях
От: andyp  
Дата: 20.02.14 12:47
Оценка:
Здравствуйте, niXman, Вы писали:

X>Здравствуйте, MT-Wizard, Вы писали:


MW>>P.S. И да, конструкторы генератора и девайса в msvc std очень даже тормозят

X>и в libstdc++, и в libc++ — т.е. везде, что неудивительно.

+1. Создание твистра в стеке каждый раз когда число нужно — абсурд.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.