2016-06-07 2 views
7

매개 변수로 함수를 성공적으로 전달했습니다.사용자 정의 함수를 하나의 명령문 내에서 템플릿 매개 변수로 전달합니다.

// 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" 
+1

이미'[표준 : 바인드를 시도해 봤어 ()'] (http://en.cppreference.com/w/cpp/utility/functional/bind)? –

+1

정식 방법은 함수 객체의 유형을 유형 - 템플릿 인수로 전달하여 클래스에 저장하고 클래스 생성자에서 초기화하는 것입니다. –

+0

다음과 같은 의미입니다. - AMap의 생성자 중 "입니다. 다른 코드 줄이 필요합니다. – javaLover

답변

5

사용 :

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); } 
    // ... 
}; 
당신이 멤버 함수 barclass Foo

Suppossed :

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

당신은뿐만 아니라 멤버 함수를 전달할 수 람다 등과 같은 :

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); 
+1

아, 스냅 ........! – Nim

+1

고맙지 만 G : doSomething과 같은 특정 기능을 사용하려면 해당 맵을 어떻게 알 수 있습니까? – javaLover

+1

@javaLover 멤버 함수는 일반 함수가 아닙니다. 그것들은 각각의 클래스의 객체와 바인딩되어야한다.이를 위해서는'std :: bind'가 필요하다. – 101010