шаблон вызываемого (обратного вызова) как параметр шаблона класса

Я хотел бы добиться чего-то вроде этого:

template<class IT>
size_t foo(IT begin,IT end) {return end-begin;}

template<template (class) class FOO>
class BAR
{
public:
any_container<any_type> container;
size_t call_foo
{
FOO<any_container<any_type>::iterator>(container.begin(), container.end());
}
};

Более того, я хочу передать функцию, лямбду или объект функции как FOO,
Наверное std::function следует использовать здесь, но это не возможно объявить std::function<size_t(T,T)> с произвольным типом T,
И я определенно не хочу указывать тип внутреннего контейнера или его итератор в списке аргументов шаблона BAR.

Есть ли способ решить это элегантно?

1

Решение

Исходя из вашего комментария, я думаю, что вы ищете что-то вроде этого:

#include <algorithm>
#include <iostream>
#include <iterator>
#include <utility>
#include <vector>

struct Sender {

template<typename Iter>
std::size_t operator()(Iter begin, Iter end) {
for(Iter cur = begin; cur != end; ++cur) {
// your low-level send stuff
}
return (end - begin);
}
};

struct Receiver {

template<typename Iter>
std::size_t operator()(Iter begin, Iter end) {
for(Iter cur = begin; cur != end; ++cur) {
// your low-level receive stuff
}
return (end - begin);
}
};

template<typename Fn>
struct Bar
{
protected:
Fn _fn;
public:
Bar(Fn fn) : _fn(std::move(fn)) { }

template<typename Container>
std::size_t call_fn(Container & container)
{
return _fn(std::begin(container), std::end(container));
}
};

template<typename Fn>
auto create_bar(Fn && fn) -> Bar<typename std::remove_reference<Fn>::type> {
return { std::forward<Fn>(fn) };
}

Использование простое:

template<typename Iter>
std::size_t my_foo(Iter begin, Iter end) {
return (end - begin);
}

int main(int argc, char ** argv) {
typedef typename std::vector<int>::iterator iter;
// functors
auto functor = create_bar(Sender());
// lambdas
auto lambda = create_bar([](iter begin, iter end) -> std::size_t { return (end - begin); });
// plain old functions
auto function = create_bar(&my_foo<iter>);

std::vector<int> tmp = { 0, 1, 2, 5};

std::cout << "Functor: " << functor.call_fn(tmp) << std::endl;
std::cout << "Lambda: " << lambda.call_fn(tmp) << std::endl;
std::cout << "Function: " << function.call_fn(tmp) << std::endl;

return 0;
}

Живой пример Вот

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]