Geleneksel işlev göstergelerine bir alternatif olarak, template alias'u tanıtan C++ 11, variadic templates ile birlikte işlev işaretçisi sintaks'ı basitleştirebilir.Aşağıda, bir "şablon" fonksiyonu işaretçisi oluşturmak için bir örnek:
template <typename R, typename ...ARGS> using function = R(*)(ARGS...);
Bu şekilde kullanılabilir
: Ayrıca
void foo() { ... }
int bar(int) { ... }
double baz(double, float) { ... }
int main()
{
function<void> f1 = foo;
function<int, int> f2 = bar;
function<double, double, float> f3 = baz;
f1(); f2({}); f3({}, {});
return 0;
}
, bu fonksiyon aşırı ile düzgünce başa çıkabilirim:
void overloaded(int) { std::cout << "int version\n"; }
void overloaded(double) { std::cout << "double version\n"; }
int main()
{
function<void, int> f4 = overloaded;
function<void, double> f5 = overloaded;
f4({}); // int version
f5({}); // double version
return 0;
}
Ve işlev-işaretçileri parametreleri ilan etmek çok zarif bir yolu olarak kullanılabilir:
void callCallback(function<int, int> callback, int value)
{
std::cout << "Calling\n";
std::cout << "v: " << callback(value) << '\n';
std::cout << "Called\n";
}
int main()
{
function<int, int> f2 = bar;
callCallback(f2, {});
return 0;
}
Bu şablon diğer adı, std::function
alternatifinin yanı sıra sakıncaları ve avantajları da bulunmuyor (good explanation here). Bir kısa olarak Live demo
, ben variadic şablonları ile kombine şablon takma çiğ işlev işaretçileri için iyi, güzel temiz ve modern C++ alternatif (bu takma adı hala sonuçta işlev işaretçileri olduğunu düşünüyorum) Ama std::function
iyi, güzel, temiz ve modern C++ yanı sıra dikkate almak için iyi avantajları ile. Fonksiyon işaretçilerine (veya takma adı) yapıştırmak veya std::function
'u seçmek, uygulama ihtiyaçlarınıza bağlıdır.
mümkün yinelenen [I Std :: işlevi veya C++ bir işlev işaretçisi kullanımı mı?] (http://stackoverflow.com/questions/25848690/should-i-use-stdfunction-or-a-function-pointer -in-c) –
deneyin lambda'lar yerine :) –
@AndrewLavq, ben lambdas okunabilirlikle karmaşa kullanıyorum eğer bazı ağır baskı fonksiyonları (olmasa da bir uygulama, sadece demo amaçlı) vardır. –