可以使用模板將回呼傳遞給其他函式,以從真實的回呼型別中抽象出來:
float foo(int x, int y) {return x*y;}
template<class F>
void call_it(F f, int a, int b)
{
f(a,b);
}
f作為引數傳遞并間接呼叫它是有代價的。我想知道,如果f是靜態函式,是否可以以某種方式“直接”將其傳遞給模板函式,而不向函式引數串列添加可呼叫物件,以便可以靜態系結呼叫。我看到了將整數值作為模板引數傳遞的類比。它不需要添加任何新的函式引數,因為它將整數作為立即值傳遞給函式代碼:
template<int X> int foo(int y) {return X y;}
這是一個非作業代碼,展示了我想要實作的目標:
template<class F>
void call_it(int a, int b)
{
F(a,b); // Assume that F is a static function and can be called directly
}
有沒有辦法實作它?
uj5u.com熱心網友回復:
您可以使用非型別模板引數。要仍然允許您可以使用各種可呼叫物件auto:
#include <iostream>
struct foo {
static float bar(int a,int b){
std::cout << "foo: " << a << " " << b;
return a b;
}
};
template <auto f>
float call_it(int a,int b){
return f(a,b);
}
int main() {
call_it<&foo::bar>(1,2);
}
或沒有auto:
template <float (*f)(int,int)>
float call_it(int a,int b){
return f(a,b);
}
uj5u.com熱心網友回復:
非常簡單:
float foo(int x, int y) {return x*y;}
template<auto f>
auto call_it(int a, int b)
{
return f(a,b);
}
int main()
{
std::cout << "ret val: " << call_it<foo>(1,2) << std::endl;
}
這很容易,因為您可以使用非型別模板引數。您可以使用 type 完全指定它,或者更容易使用auto. 最后一個問題是什么都可以傳,呼叫非型別模板引數會晚報失敗。也許使用檢查呼叫能力的概念是最好的方法。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/425702.html
標籤:C
