Argüman olarak C ++ şablonları işlevlerini geçen kuralları arıyorum.
Bu, burada bir örnekte gösterildiği gibi C ++ tarafından desteklenir:
#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>();
}
Ancak bu tekniği öğrenmek zordur. "Şablon argümanı olarak işlev" için googling yapmak pek bir şey yapmaz. Ve klasik C ++ Şablonları Komple Kılavuz şaşırtıcı bir şekilde de tartışmıyor (en azından aramamdan değil).
Sorularım, bu geçerli C ++ (ya da sadece geniş çapta desteklenen bir uzantı) olup olmadığıdır.
Ayrıca, aynı imzalı functor'ın bu tür şablon çağırma sırasında açık işlevlerle dönüşümlü olarak kullanılmasına izin vermenin bir yolu var mı?
Sözdizimi açıkça yanlış olduğu için aşağıdaki programda, en azından Visual C ++ ' da çalışmaz . Özel bir karşılaştırma işlemi tanımlamak isterseniz, bir işlev işaretçisi veya işlevlisini std :: sort algoritmasına geçirebilmenize benzer şekilde, bir işlev için bir işlevi ya da tam tersi bir işlevi değiştirebilmeniz güzel olurdu.
struct add3 {
void operator() (int &v) {v+=3;}
};
...
doOperation<add3>();
Bir veya iki web bağlantısına veya C ++ Şablonları kitabındaki bir sayfaya işaret etmek takdir edilecektir!
-std=gnu++17
. Bir C ++ 17 captureless lambda constexpr dönüşüm operatörünün sonucunu işlev işaretçisi şablonu tür olmayan bir bağımsız değişken olarak kullanabilir miyim? .