Я шукаю правила, пов’язані з передачею функцій шаблонів C ++ як аргументів.
Це підтримується C ++, як показано на прикладі тут:
#include <iostream>
void add1(int &v)
{
v+=1;
}
void add2(int &v)
{
v+=2;
}
template <void (*T)(int &)>
void doOperation()
{
int temp=0;
T(temp);
std::cout << "Result is " << temp << std::endl;
}
int main()
{
doOperation<add1>();
doOperation<add2>();
}
Однак дізнатися про цю техніку важко. Гуглінг для "функції як аргументу шаблону" не призводить до великого. І класичні шаблони C ++ Повне керівництво дивно також не обговорює це (принаймні, не з мого пошуку).
У мене є питання, чи дійсно це C ++ (або просто якесь широко підтримуване розширення).
Крім того, чи є спосіб дозволити функціонеру з таким же підписом взаємозамінно використовуватись із явними функціями під час виклику цього шаблону?
Далі не працює у вищезгаданій програмі, принаймні у Visual C ++ , оскільки синтаксис, очевидно, неправильний. Було б непогано мати можливість вимкнути функцію для функтора, і навпаки, подібно до того, як ви можете передати покажчик функції або функтор алгоритму std :: сортування, якщо ви хочете визначити спеціальну операцію порівняння.
struct add3 {
void operator() (int &v) {v+=3;}
};
...
doOperation<add3>();
Вказівки на веб-посилання-два чи сторінку в книзі шаблонів C ++ будуть вдячні!
-std=gnu++17
. Чи можу я використати результат оператора перетворення конвертпресу лямбда-конспекта C ++ 17 як аргумент нетипового шаблону вказівника? .