2013-06-02 3 views
1

:가변 인자 템플릿 기능 나는 다음과 같은 컴파일하기 위해 노력하고있어

g ++ 4.8과 함께 다음과 같은 컴파일러 오류로 연결
#include <vector> 
#include <array> 

template <typename T> 
void sort(T &container) {} 

template <typename F, typename T, typename ...Tail> 
void sort_containers(F sort_func, T &container, Tail &...tail) { 
    sort_func(container); 
    sort_containers(sort_func, tail...); 
} 

template <typename F, typename T> 
void sort_containers(F sort_func, T &container) { 
    sort_func(container); 
} 

int main() { 
    std::vector<int> x = {1,2,3}; 
    std::vector<double> y = {1.0, 2.0, 3.0}; 
    std::array<char, 3> z = {{'d' , 'b', 'c'}}; 
    sort_containers(sort, x, y, z); 
} 

:

error: no matching function for call to 
‘sort_containers(<unresolved overloaded function type>, 
std::vector<int>&, std::vector<double>&, std::array<char, 3u>&)’ 

I sort_containers에 전달할 때 sort에 대한 템플릿 매개 변수를 지정해야한다는 것을 알고 있지만 가변 템플릿 함수가있는 경우 어떻게 작동하는지 잘 모르겠습니다.

+0

이것은 variadic이 아닌 템플릿'sort_three_containers'에서 작동하는 것처럼 작동합니다. 즉, 너무 잘되지 않습니다. 함수 (템플릿)가 아니라 멤버 함수 템플릿이있는 객체를 전달해야 정렬이 수행되므로 'sort_containers'를 호출 할 때마다 인스턴스가 생성됩니다. –

+0

비 variadic 템플릿을 사용하면 다음과 같이 할 수 있습니다 : http://ideone.com/jBg5yT,이 예제는'sort_three_containers' – countfromzero

답변

4

template 함수는 함수가 아닌 함수 팩터 리입니다. 그들은 직접 주위로 전달할 수 없습니다. 이제

은 펑이 될 수 있으며, 비교적 간단한 래퍼는 펑터로 기능의 과부하 세트를 설정할 수 있습니다 :

가 아니라 template하여, 매크로를 통해 생성 할 수
struct sort_functor { 
    template<typename...Args> 
    auto operator()(Args&&... args) const -> 
    decltype(sort(std::forward<Args>(args)...)) 
    { return sort(std::forward<Args>(args)...); } 
}; 

, 당신은 통과 할 수 없기 때문에 과부하 세트! 그런 다음 sort_functor()을 다른 template에 전달합니다.

#define MAKE_OVERLOAD_FUNCTOR(NAME) \ 
    struct CONCAT(NAME, _functor) { \ 
    template<typename...Args> \ 
    auto operator()(Args&&... args) const -> \ 
    decltype(NAME(std::forward<Args>(args)...)) \ 
    { return NAME(std::forward<Args>(args)...) } \ 
    }; 

[] 토큰의 추가 남용을 통해 자동적으로 위의 펑터를 생성 할 수있는 제안이있다.

+1

Pff, "abuse"로 확장되지 않습니다. 난 그냥 람다 구문에 기대어. : P – Xeo

+0

나는 "* 더 * 남용"이라고 말했다 :) 람다 구문은 초기 학대 @xeo – Yakk

관련 문제