Передать шаблон функции в другую функцию - PullRequest
3 голосов
/ 16 февраля 2012

Предположим, у меня есть функция, которая делает что-то для произвольного типа контейнера (C ++ 11):

template<class containerType>
void bar( containerType& vec ) {

        for (auto i: vec) {
                std::cout << i << ", ";
        }

        std::cout << '\n';
}

Я могу вызвать эту функцию из другой функции, подобной этой:

void foo() {
        std::vector<int> vec = { 1, 2, 3 };
        bar(vec);
}

Теперь предположим, что у меня есть разные функции, такие как bar, и я хочу передать одну из этих функций в foo, тогда foo будет выглядеть примерно так:

template<class funcType>
void foo( funcType func ) {
    std::vector<int> vec = { 1, 2, 3 };
    func(vec);
}

Однако вызов foo выглядит так:

foo(bar);

не работает (довольно ясно, так как bar - это не функция, а шаблон функции).Есть ли хорошее решение для этого?Как мне определить foo, чтобы эта работа работала?

РЕДАКТИРОВАТЬ: вот минимальный компилируемый пример, как того требуют комментарии ...

#include <iostream>
#include <vector>
#include <list>

template<class containerType>
void bar( containerType& vec ) {

        for (auto i: vec) {
                std::cout << i << ", ";
        }

        std::cout << '\n';
}

template<typename funcType>
void foo(funcType func) {

        std::vector<int> vals = { 1, 2, 3 };
        func(vals);

}

int main() {
        // foo( bar );  - does not work.
}

Ответы [ 3 ]

4 голосов
/ 16 февраля 2012

Онлайн демо на http://ideone.com/HEIAl

Это позволяет вам сделать foo(bar).Вместо того, чтобы передавать функцию-шаблон или класс-шаблон, мы передаем не шаблонный класс, который имеет функцию-член-шаблон.

#include <iostream>
#include <vector>
#include <list>

struct {
    template<class containerType>
    void operator() ( containerType& vec ) {

        for (auto i = vec.begin(); i!=vec.end(); ++i) {
                std::cout << *i << ", ";
        }

        std::cout << '\n';

    }
} bar;

template<typename funcType>
void foo(funcType func) {

        std::vector<int> vals = { 1, 2, 3 };
        func(vals);

}

int main() {
        foo( bar );
}
3 голосов
/ 16 февраля 2012

Если вы знаете, что foo работает с вектором int, вы можете передать функцию bar< std::vector<int> >.

Разумным решением будет для модуля, который определяет foo, также определить typedef для используемого контейнера.,Тогда вам даже не нужно bar, чтобы быть шаблоном.

2 голосов
/ 16 февраля 2012

Как то так? (не полностью проснулся, может упустить смысл)

#include <iostream>
#include <vector>
#include <list>

struct Test{
template<class containerType>
static void apply( containerType& vec ) {

        for (auto it = vec.begin(); it != vec.end(); ++it) {
                std::cout << *it << ", ";
        }

        std::cout << '\n';
}
};

template<class FuncStruct>
void foo() {

        std::vector<int> vals;
        vals.push_back(1);
        FuncStruct::apply(vals);

}

int _tmain(int argc, _TCHAR* argv[])
{
    foo<Test>();
    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...