Saya mencari aturan yang melibatkan fungsi templat C ++ sebagai argumen.
Ini didukung oleh C ++ seperti yang ditunjukkan oleh contoh di sini:
#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>();
}
Namun, mempelajari teknik ini sulit. Googling untuk "berfungsi sebagai argumen templat" tidak menghasilkan banyak. Dan Template C ++ klasik Panduan Lengkap mengejutkan juga tidak membahasnya (setidaknya bukan dari pencarian saya).
Pertanyaan saya adalah apakah ini valid C ++ (atau hanya beberapa ekstensi yang didukung secara luas).
Juga, apakah ada cara untuk memungkinkan functor dengan tanda tangan yang sama untuk digunakan secara bergantian dengan fungsi eksplisit selama jenis permohonan template ini?
Berikut ini tidak berfungsi dalam program di atas, setidaknya dalam Visual C ++ , karena sintaksnya jelas salah. Akan lebih baik untuk dapat beralih fungsi untuk functor dan sebaliknya, mirip dengan cara Anda dapat melewati pointer fungsi atau functor ke std :: sort algoritma jika Anda ingin mendefinisikan operasi perbandingan kustom.
struct add3 {
void operator() (int &v) {v+=3;}
};
...
doOperation<add3>();
Pointer ke satu atau dua tautan web, atau satu halaman di buku C ++ Templates akan dihargai!
-std=gnu++17
. Dapatkah saya menggunakan hasil dari operator konversi constexpr lambda C ++ 17 captureless sebagai argumen penunjuk fungsi templat-tipe? .