2016-03-20 3 views
0

У меня есть к классам:Как написать функцию, которая принимает разные типы аргументов?

template <class T> 
class shared_vector 
{ 
    T data; 
} 

template <class T> 
class device_vector 
{ 
    T data; 
} 

Я хочу, чтобы написать функцию, которая п accects любой объект, будь то типа shared_vector или device_vector и устанавливает некоторые флаги соответственно.

Теперь очевидным решением является переход на перегрузка функции. Но предположим, что функция f принимает 10 аргументов, которые могут быть либо shared_vector, либо device_vector, Мне пришлось бы написать 1024 перегруженных функции.

Другим решением является использование родительского классаhybrid_vector из которых как device_vector и shared_vector наследует от.

Но, к сожалению, код device_vector не входит в мой контроль.

Как решить эту проблему?

ПРИМЕЧАНИЕ: Я знаю, что typeid (переменная) .name() может указывать тип, но что будет объявлением моей функции и как я могу вывести из него тип?

+1

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

+1

Что общего у этих разных типов? –

+0

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

ответ

2

Возможно, вам будет предложено принять boost::variant<shared_vector<T>, device_vector<T>>.

Другой вариант std::enable_if:

template<typename V> 
std:enable_if< 
    std::same_type<V, shared_vector<decltype(V::data)>::value | 
    std::same_type<V, device_vector<decltype(V::data)>::value , 
    void>::type 
foo(V const& vector); 

Тем не менее будет многословным, если у вас есть V1..V10, но это всего лишь 2 * 10 проверяет, не 1024. И, конечно, вы можете написать свой собственный is_device_or_shared<Vector>::value, чтобы обернуть эти 2 испытания в чем-то более читаемом.