2013-06-10 4 views
1

Например, у меня есть 3 разных объекта a, b и c; каждый из которых является экземпляром другого класса. Я хочу объявить функцию, которая примет массив std :: vector в качестве аргумента; где векторный массив представляет собой массив объектов a, b или c (не смешанный). Как я могу это сделать?В C++, как я могу объявить функцию, которая принимает векторный массив любого объекта как agrument?

Мой код:

//TODO: make this work for any vector array in the program; 
bool assert_choice (std::vector<?> array) { //asserts that choice is valid 
    std::cout << "ohai" << std::endl; 
    return true; 
} 

Я не уверен, как объявить аргумент.

+0

с шаблоном. – chris

ответ

2

Используйте шаблон функции:

template< class T > 
bool assert_choice(std::vector<T> array) 
{ 
    //... 
} 

Вы могли бы также рассмотреть вопрос о переходе по ссылке std::vector<T> & или const std::vector<T> &.

+0

Пара итераторов может быть хорошей идеей. Затем он может использовать любой контейнер последовательности, а не только вектор. –

+0

Похоже, что OP должен ограничивать его только типами A, B или C, хотя ... –

+1

@OliCharlesworth Непонятно, каково их намерение, но в названии вопроса указано «любой объект», и нет упоминания ограничить его * только * типами ** A **, ** B ** и ** C **. – paddy

1

Предполагая, что вы используете a, b, c в качестве примеров, а не только типы вы хотите, чтобы пройти, не проходите мимо вектора а итератора пары:

template <class Iter> 
bool assert_choice (Iter first, Iter last) { ... } 

С помощью этого подхода , любой тип, соответствующий требуемому интерфейсу, может быть успешно передан.

1

Вы можете создать тип признака для этого:

#include <type_traits> 

template <typename T, typename V = void> 
struct is_type : std::false_type {}; 

template <typename T> 
struct is_type<T, typename std::enable_if<std::is_same<T, A>::value 
             || std::is_same<T, B>::value 
             || std::is_same<T, C>::value 
       >::type 
> : std::true_type {}; 

И изменить свой класс, чтобы взять шаблон, как это. Таким образом, он будет собирать только если T тип A, B или C:

template <typename T, 
      typename std::enable_if<is_type<T>::value>::type* = nullptr> 
bool assert_choice(std::vector<T>& var) 
{ 
    // ... 
    return true; 
} 
Смежные вопросы