我成功传递了一个函数作为参数。
// 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
那些Dummy降低了代码的可读性。
我能以更简洁的方式打电话吗?
AMap<G,int,
[](G&goo)->int{ return goo.doSomething (); }
>map;
我试过,但编译说
expected compile-time constant expression
看起来编译器认为lambda函数不是编译时常量,但我确信它的行为是。
我已阅读How to use a lambda expression as a template parameter?,但没有解决方案可以提供1语句方式。
如果我能称之为
,我会很理想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
因此,我不希望每1个键分配1个功能。
换句话说,松散地说......
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"
答案 0 :(得分:5)
改为使用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); }
// ...
};
假设您有class Foo
成员函数bar
:
struct Foo {
int bar(G&);
};
您可以将成员函数以及lambdas等传递为:
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);