Информация об изменениях

Сообщение Re[3]: Не могу явно инстанцировать шаблон функции-члена от 11.10.2018 8:31

Изменено 11.10.2018 8:32 andyp

Re[3]: Не могу явно инстанцировать шаблон функции-члена
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>Есть ли более надежные способы борьбы с этим, кроме вот такого извращения?


ЕМ>
ЕМ>  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 ExtendedPrecisionType<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]: Не могу явно инстанцировать шаблон функции-члена
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>Есть ли более надежные способы борьбы с этим, кроме вот такого извращения?


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