2015-07-10 2 views
0

Рассмотрима рабочего кода, который я написал:Шаблон рекурсии с помощью двоичного поиска

#include <iostream> 

constexpr int MIN_FOO = 0, MAX_FOO = 100; 

template <int N> 
void foo() {std::cout << "foo<" << N << ">() called.\n";} 

template <int N> 
void foo (char, double, bool) {std::cout << "foo<" << N << ">(char, double, bool) called.\n";} 


template <int Low, int High, typename... Args> 
void searchFooBinary (int key, Args... args) { 
// if (LOW > HIGH) {std::cout << "Error with searchFooBinary.\n"; return;} 
    constexpr int Mid = (Low + High) /2; 
    if (key == Mid) 
     foo<Mid>(std::forward<Args>(args)...); // Want to generalize this using 'f'. 
    else if (key < Mid) 
     searchFooBinary<Low, Mid - 1>(key, std::forward<Args>(args)...); 
    else 
     searchFooBinary<Mid + 1, High>(key, std::forward<Args>(args)...); 
} 

template <typename... Args> 
void executeFooBinarySearch (int n, Args... args) { 
    searchFooBinary<MIN_FOO, MAX_FOO>(n, std::forward<Args>(args)...); 
} 

int main() { 
    executeFooBinarySearch(99); 
    executeFooBinarySearch (99, 'a', 1.5, true); 
} 

Так foo функция шаблона и здесь проходит время выполнения INT и searchFooBinary использует бинарный поиск, чтобы найти правильное значение INT для аргумент шаблона. Пока что так хорошо, но я не хочу писать эту функцию двоичного поиска для каждой новой функции, например foo. Как обобщить использование foo в searchFooBinary в общем f? Если указатель функции шаблона не разрешен, каково было бы обходным путем для достижения этой цели?

ответ

2

Как об использовании функтор:

#include <iostream> 

constexpr int MIN_FOO = 0, MAX_FOO = 100; 

struct Foo 
{ 
    template <int N> 
    void operator() (char, double, bool) {std::cout << "Foo<" << N << ">(char, double, bool) called.\n";} 
}; 

struct Bar 
{ 
    template <int N> 
    void operator()() {std::cout << "Bar<" << N << ">() called.\n";} 
}; 


template <int Low, int High, typename Fun, typename... Args> 
void searchBinary (int key, Fun f, Args... args) 
{ 
    constexpr int Mid = (Low + High) /2; 
    if (key == Mid) 
    { 
     f.template operator()<Mid>(std::forward<Args>(args)...); 
    } 
    else if (key < Mid) 
    { 
     searchBinary<Low, Mid - 1>(key, f, std::forward<Args>(args)...); 
    } 
    else 
    { 
     searchBinary<Mid + 1, High>(key, f, std::forward<Args>(args)...); 
    } 
} 

template <typename Fun, typename... Args> 
void executeBinarySearch (int n, Fun f, Args... args) 
{ 
    searchBinary<MIN_FOO, MAX_FOO, Fun>(n, f, std::forward<Args>(args)...); 
} 

int main() 
{ 
    executeBinarySearch (99, Foo(), 'a', 1.5, true); 
    executeBinarySearch (99, Bar());  
} 

выход

Foo<99>(char, double, bool) called. 
Bar<99>() called. 

Живой пример: http://ideone.com/fSoG5B

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