2015-09-23 3 views
5

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

type& operator=(unsigned int); 
type& operator=(unsigned long int); 
type& operator=(unsigned long long int); 
type& operator=(int); 
type& operator=(long int); 
type& operator=(long long int); 
type& operator=(short int); 
//so on and so forth... 

Они должны делать то же самое ... (кроме я должен принимать во внимание разные размеры), основной идеей было бы «, если тип является самым широким используйте код для задачи ... иначе выполните кастинг и выполните код ». Можно ли исключить весь такой повторяющийся код, используя только один метод? (я просто не хочу, чтобы компилятор бросил мне предупреждение, когда я скомпилирую ...).

Спасибо

+0

Назначение от примитивных целочисленных типов проблематично по разным причинам, но если вы должны сделать это: вы пробовали только реализацию перегружаемые 'intmax_t 'и' uintmax_t' (от '')? – pmdj

+0

Да, я использую cstdint, я просто хочу избежать написания всего того же кода ... элегантным и эффективным способом. – user8469759

ответ

6

Это будет работать для всех целочисленных типов:

template< 
    typename T, 
    typename = std::enable_if_t<std::is_integral<T>::value> 
> 
type& operator= (T); 

Если вы хотите, чтобы в зависимости от размера, он может быть получен с просто sizeof(T). Вы можете сравнить это с вашим самым большим желаемым размером.

Если вам нужны две отдельные функции, вам нужно также поставить это предложение и использовать какой-то статический-все.

+0

Есть ли альтернатива шаблонам? их довольно трудно читать. – user8469759

+0

@ Lukkio Извините, но что вам трудно читать в этом коде? Я думаю, что это довольно просто. –

+0

@TartanLlama или штопать, право. –

6

В дополнение к answer of Bartek Banachewicz альтернативный способ решить:

struct type 
{ 
    ////Solution by Bartek Banachewicz 
    //template<typename T,typename = typename std::enable_if<std::is_integral<T>::value>::type> 
    //type& operator= (T) 
    //{ 
    // return *this; 
    //} 

    template<typename T> 
    auto operator=(T) -> typename std::enable_if<std::is_integral<T>::value, type>::type& 
    { 
     return *this; 
    } 
}; 
+1

Я чувствую, что эта ссылка http://stackoverflow.com/a/22515589/1614219 может быть полезна тем, кто (как я), не знаю о синтаксисе '->' в подписях. – dureuill

+0

этот ответ лучше, потому что он позволяет несколько перегрузок 'std :: enable_if' (вы не можете изменить аргумент шаблона функции по умолчанию) – TemplateRex

Смежные вопросы