在1语句中传递一个自定义函数作为模板参数

Pass a custom function as template parameter within 1 statement

本文关键字:自定义函数 一个 参数 语句      更新时间:2023-10-16

我成功地将一个函数作为参数传递。

// this is in a scope of a normal function
class DummyClass{
public: static int dummyFunction(G& goo){
return goo.doSomething (); //non-static function
//Edit 3: it calculates hash value
}
};
AMap<G,int,DummyClass::dummyFunction>map;
//... do some other thing

这些伪代码降低了代码的可读性。

我可以用更简洁的方式来称呼它吗?

AMap<G,int,
[](G&goo)->int{ return goo.doSomething (); }
>map;

我试过了,但编译器说

expected compile-time constant expression

看起来编译器认为lambda函数不是编译时间常数,但我确信它的行为是。

我已经阅读了如何使用lambda表达式作为模板参数,但是没有一个解决方案能够提供一个语句的方式。

如果我能把它称为,那我将是理想的选择

AMap<G,int, G::doSomething >map; //note that G::doSomething is non-static

编辑

这就是我宣布AMap 的方式

template<class K,class T,int (* K_uniqueHash)(K&) >AMap {//<--- can be changed
private: int getIndex(K& k){
return K_uniqueHash(k);  //<--- can be changed
}
//.. other function
}

您的答案也可以更改上述类别的代码。

编辑2:对AMap的任何修改都不算作额外的行,因为它是一个库。

编辑3:对不起,我的模板可能会产生误导。

映射只使用1个函数进行哈希。

template<class K,class T,int (* K_uniqueHash)(K&) >AMap
^key    ^value      ^ hashing function

因此,我不希望每个键分配一个功能。

换句话说,粗略地说。。。。

AMap<K,T,k_hasher> aMap;  
K k1,k2;  T t1,t2;
aMap[ k1 ] = t1;  aMap[ k2 ] =t2;
// Then, these statements below will be called internally.
k1.k_hasher(); 
k2.k_hasher();  //every k call same function "k_hasher"

改用std::function

AMap<G,int, std::function<int(G&)>> m;

编辑:

您可以按如下方式更改AMap类:

template<typename K, typename T, typename F>
class AMap {
int getIndex(K& k) { return K_uniqueHash(k); }
// ...
};

假设您有一个具有成员函数bar:的class Foo

struct Foo {
int bar(G&); 
};

您可以将成员函数以及lambda等传递为:

AMap<G,int, std::function<int(G&)>> m;
auto f = [](G &i)->int { return 42; };
m[0] = f; // if your class works like a map
Foo foo;
m[2] = std::bind(&Foo::bar, &foo, std::placeholders::_1);