매개 변수로 함수를 성공적으로 전달했습니다.사용자 정의 함수를 하나의 명령문 내에서 템플릿 매개 변수로 전달합니다.
// 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
말했다.
나는 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 개의 기능을 할당 할 것으로 예상하지 않습니다. 느슨하게 말하기 즉,
있습니다 .... std::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"
이미'[표준 : 바인드를 시도해 봤어 ()'] (http://en.cppreference.com/w/cpp/utility/functional/bind)? –
정식 방법은 함수 객체의 유형을 유형 - 템플릿 인수로 전달하여 클래스에 저장하고 클래스 생성자에서 초기화하는 것입니다. –
다음과 같은 의미입니다. - AMap의 생성자 중 "입니다. 다른 코드 줄이 필요합니다. – javaLover