2013-07-09 3 views
1
#include <vector> 
#include <iostream> 
#include "boost/function.hpp" 


template <class T1, class T2, class T3> 
static void 
FOREACH (T1 cont, boost::function<T2(T3)> callback) { 
    typename T1::iterator it = cont. begin(); 
    for (; it != cont. end(); it++) { 
     callback (*it); 
    } 
} 


static void 
Print (int number) 
{ 
    std:: cout << number << std:: endl; 
} 


int main() 
{ 
    std:: vector<int> vec; 
    for (int i=1; i <= 10; ++i) vec. push_back (2*i); 

    FOREACH (vec, fun); 

    return 0; 
} 

Почему код выше не компилируется? Если я создаю специализированную версию, как показано ниже, она работает нормально.boost :: функция с функциональными шаблонами

static void 
FOREACH (std:: vector<int> cont, boost::function<void(int)> callback) { 
    std:: vector<int>:: iterator it = cont. begin(); 
    for (; it != cont. end(); it++) { 
     callback (*it); 
    } 
} 

Пожалуйста, скажите мне, как я могу использовать функцию boost :: с шаблонами функций?

+1

Это не помогает, что 'fun' не был объявлен. – juanchopanza

+0

«забава» - это опечатка, это «Печать» –

ответ

1

Было бы проще сделать функтор параметр шаблона:

template <class T1, class F> 
static void FOREACH (T1 cont, F callback) { 
    typename T1::iterator it = cont.begin(); 
    for (; it != cont. end(); it++) { 
     callback (*it); 
    } 
} 

Это будет работать, если вы передаете его совместимым вызываемым объектом, который на самом деле существует. Конечно, было бы еще проще использовать std::for_each:

#include <algoritm> 

... 

std::for_each(vec.begin(), vec.end(), Print); 
Смежные вопросы