2016-09-05 2 views
1

Я пытаюсь написать одну функцию шаблона, которая отлично работает в обоих случаях. У меня есть две функции:Условное генерирование кода в функции шаблона

template <typename T> 
Check(T&) 

template <typename U, typename V> 
Check(U&, V&) 

У меня есть функция, которую я хотел бы написать один реализации, где в случае любого другого типа, чем пары, я хочу, чтобы это назвать Check (T &), и если у нас есть std :: pair, тогда он должен вызывать два варианта параметра Check. Другими словами, код типа:

void SomeFunction() { 
    ... 
    if (type(x) is std::pair<U,V>) 
    Check(x.first, x.second); 
    else 
    Check(x); 
    ... 
} 

Есть ли способ выполнить это поведение с использованием магии шаблонов? Код предпочтительно должен работать с C++ 11. У меня есть код для функций проверки, и они являются внутренними для класса, поэтому я могу настроить их интерфейс, если это необходимо.

ответ

1

Вы имели в виду что-то вроде этого? Он обеспечивает перегрузку, которая работает только для пар и вызывает функцию 2 аргументов.

#include <iostream> 
#include <utility> 

template <typename T> 
void Check(T& t) 
{ 
    std::cout << "single argument version " << t << '\n'; 
} 

template <typename U, typename V> 
void Check(U& u, V& v) 
{ 
    std::cout << "pair version " << u << " and " << v << '\n'; 
} 

template<typename T> 
void call(T& t) 
{ 
    Check(t); 
} 

template<typename T, typename U> 
void call(const std::pair<T, U>& t) 
{ 
    Check(t.first, t.second); 
} 

int main() 
{ 
    int i = 1; 

    call(i); 
    call(std::pair<int, char>(2, 'c')); 
} 
1

Обычный способ обработки такого рода вещи, чтобы разделить тип-зависимой часть в отдельный, частично перегруженный набор функций:

template <typename T> 
void do_check(T& t) { 
    Check(t); 
} 

template <typename U, typename V> 
void do_check(std::pair<U, V>& p) { 
    Check(p.first, p.second); 
} 

void SomeFunction() { 
    ... 
    do_check(x); 
    ... 
} 
1

Просто добавьте перегрузку

template <typename T> 
void Check(T&); 

template <typename U, typename V> 
void Check(U&, V&); 

template <typename U, typename V> 
void Check(std::pair<U, V>& p) 
{ 
    Check(p.first, p.second); 
} 

И ваш код becames

void SomeFunction() { 
    // ... 
    Check(x); 
    // ... 
} 
Смежные вопросы