Я создал пример моей текущей проблемы. Я хочу иметь возможность вызывать следующую функцию без указания типа шаблона, так как компилятор должен иметь возможность определить тип:
template<typename T, class Iterable>
void foreach1(std::function<void(T&)> action, Iterable& iterable) {
std::cout << typeid(T).name() << std::endl;
for (auto& data : iterable)
action(data);
}
Если я вызываю функцию таким образом:
std::vector<int> a = { 1, 2, 3 };
foreach1([](int& data) {
std::cout << data << std::endl;
}, a);
Я получаю ошибку. Я знаю, что могу решить эту проблему, заменив std :: function шаблоном следующим образом:
template<class Action, class Iterable>
void foreach2(Action action, Iterable& iterable) {
//std::cout << typeid(T).name() << std::endl; // no access to T
for (auto& data : iterable)
action(data);
}
Но при этом я потеряю доступ к типу T . Есть ли способ сохранить доступ к типу T и иметь возможность использовать шаблонный аргумент?