Сообщение Re[3]: Не могу явно инстанцировать шаблон функции-члена от 11.10.2018 8:31
Изменено 11.10.2018 8:33 andyp
Re[3]: Не могу явно инстанцировать шаблон функции-члена
Здравствуйте, Евгений Музыченко, Вы писали:
ЕМ>Есть ли более надежные способы борьбы с этим, кроме вот такого извращения?
ЕМ>
Для начала, я бы ResultType и тип для промежуточных вычислений выбирал как-то так:
ЕМ>Есть ли более надежные способы борьбы с этим, кроме вот такого извращения?
ЕМ>
ЕМ> return static_cast <ResType> (static_cast <ResType> (0) + a * b / 1000000);
ЕМ>
Для начала, я бы ResultType и тип для промежуточных вычислений выбирал как-то так:
template<typename T, typename Enabler = void> struct ResultTypeSelector {typedef T type;};
template<typename T>
struct ResultTypeSelector <T, typename std::enable_if_t<std::is_same<T,int>::value>>
{
//тут описываешь свои правила
typedef int64_t type;
typedef int64_t IntermedType;
};
//и т.п.
template <typename ArgType> typename ResultTypeSelector<ArgType>::type MulDiv (ArgType a, ArgType b) {
using ReturnType = ResultTypeSelector<ArgType>::type;
return ReturnType((IntermedType(a) * IntermedType(b)/10000));
}
Re[3]: Не могу явно инстанцировать шаблон функции-члена
Здравствуйте, Евгений Музыченко, Вы писали:
ЕМ>Есть ли более надежные способы борьбы с этим, кроме вот такого извращения?
ЕМ>
Для начала, я бы ResultType и тип для промежуточных вычислений выбирал как-то так:
ЕМ>Есть ли более надежные способы борьбы с этим, кроме вот такого извращения?
ЕМ>
ЕМ> return static_cast <ResType> (static_cast <ResType> (0) + a * b / 1000000);
ЕМ>
Для начала, я бы ResultType и тип для промежуточных вычислений выбирал как-то так:
template<typename T, typename Enabler = void> struct ResultTypeSelector {typedef T type;};
template<typename T>
struct ResultTypeSelector <T, typename std::enable_if_t<std::is_same<T,int>::value>>
{
//тут описываешь свои правила
typedef int64_t type;
typedef int64_t IntermedType;
};
//и т.п.
template <typename ArgType> typename ResultTypeSelector<ArgType>::type MulDiv (ArgType a, ArgType b) {
using ReturnType = ResultTypeSelector<ArgType>::type;
using IntermedType = ResultTypeSelector<ArgType>::IntermedType;
return ReturnType((IntermedType(a) * IntermedType(b)/10000));
}