2015-10-12 4 views
3

Я хотел бы иметь другое значение переменной в зависимости от типа входной переменной. Код:Различное значение в зависимости от типа C++

template <typename T> 
int getValue(vector<T> & data) 
{ 
    return something; // There should be 0 for int and 1 for double 
} 

ли кто-нибудь знает, как достичь такой функциональности?

+2

Да, перегрузка –

+1

Похоже, вы пытаетесь включить типы. У вас, вероятно, есть недостаток дизайна. –

+2

@BaummitAugen Итак, специализация шаблонов и перегрузка функций ошибочны по дизайну? Существуют вполне обоснованные причины для включения типов, особенно если вы используете механизмы отправки, предоставляемые языком, а не if-else. – TheOperator

ответ

5

Если вы имеете дело с int и double, тогда вы можете просто перегрузить функцию для разных типов векторов.

int getValue(vector<int> & data) 
{ 
    return 0; 
} 

int getValue(vector<double> & data) 
{ 
    return 1; 
} 

Если вы хотите сохранить getValue как функция шаблона и специализируется на int и double, то вы можете использовать

template<typename T> 
int getValue(std::vector<T> & data) 
{ 
    return -1; 
} 

template <> 
int getValue(std::vector<int> & data) 
{ 
    return 0; 
} 

template <> 
int getValue(std::vector<double> & data) 
{ 
    return 1; 
} 

Live Example

2

Вы можете предоставить перегруженные нешаблонном, сохраняя при этом шаблон. Поскольку разрешение функции предпочитает не шаблонные совпадения над шаблонами. Пример:

template <typename T> 
int getValue(std::vector<T> & data) 
{ 
    return -1; // default template 
} 

int getValue(std::vector<int> & data) 
{ 
    return 0; // int overload 
} 

int getValue(std::vector<double> & data) 
{ 
    return 1; // double overload 
} 

Вот пример использования специализации:

template <typename T> 
int getValue(std::vector<T> & data) 
{ 
    return -1; // default template 
} 

template <> 
int getValue<int>(std::vector<int> & data) 
{ 
    return 0; // int specialization 
} 

template <> 
int getValue<double>(std::vector<double> & data) 
{ 
    return 1; // double specialization 
} 
0

Два важных операторов типа манипуляции TypeId и decltype.

typeid вернуть объект type_info с информацией о типе.

Некоторые способы проверяют типов:

  • станд :: is_same
  • TypeId
  • перегрузки Функция

Если вы используете C++ 11 лучший вариант должен быть станд :: is_same с дельта-типом (определяет тип переменной), потому что это временное разрешение компиляции.

vector<int> integers; 
    vector<double> doubles; 

    cout << is_same<vector<int>, decltype(integers)>::value << endl; 
    cout << is_same<vector<int>, decltype(doubles)>::value << endl; 
    cout << is_same<vector<double>, decltype(integers)>::value << endl; 
    cout << is_same<vector<double>, decltype(doubles)>::value << endl; 

Если вы используете стандартный C++ (C++ 98), вы можете использовать оператор TypeID

vector<int> vectorInt; 

    vector<int> integers; 
    vector<double> doubles; 

    cout << (typeid(integers) == typeid(vectorInt)) << endl; 
    cout << (typeid(doubles) == typeid(vectorInt)) << endl; 

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

На этом пути вам нужно написать функцию для каждого типа для идентификации или функция шаблона вернет -1 (неизвестно), как идентификация.

template<typename T> 
int getTypeId(T) { 
     return -1; 
}  

int getTypeId(vector<int>) { 
     return 1; 
}  

main() { 
     vector<int> integers; 
     vector<double> doubles; 
     vector<char> chars; 

     cout << getTypeId(integers) << endl; 
     cout << getTypeId(doubles) << endl; 
     cout << getTypeId(chars) << endl; 
} 
Смежные вопросы