공제

2016-07-06 16 views
31

는 이제 우리가이 같은 클래스 템플릿 있다고 가정 해 봅시다됩니다 컴파일러가 ::close에 대해이 정보를 알 수 있기 때문에 <int(int)>을 생략 할 수있는 방법이 있습니까? 템플릿의 "디자인"을 저장할 필요가 없습니다.공제

구체적인 작업은 클래스 템플릿을 디자인해야합니다. 이 클래스의 객체는 생성시이 함수에 대한 함수 및 매개 변수를 취할 수 있으며 나중에이 함수를 호출 할 수 있습니다.

답변

35

아니요, 현재 (현재) 할 수 없습니다.

template<typename F, typename... Args> 
A<std::decay_t<F>> make_A (F &&f, Args&&... args) { 
    return {std::forward<F>(f), std::forward<Args>(args)...}; 
} 

C++ (17)가 정확히 당신이 원하는 일을 할 수 template argument deduction for class를 소개합니다 :이 일을의 표준 방법은 "make_like"기능 (예 : make_pair, make_optional을 ...) 만드는 것입니다. 당신은 단지에 공장을 작성해야, 그 전에

A a(::close, 1); 

: C++ 17에서 생성자에 대한 템플릿 매개 변수 공제의 채택에

+0

나는 그 공장 기능을 만드는 적절한 방법이'std :: decay' 또는'A '에 비슷한 특성을 사용하는 것이라고 믿는다. 그러면 A >'이됩니다. http://en.cppreference.com/w/cpp/utility/optional/make_optional 또는 다른'make_ *'레퍼런스를 참조하십시오 – KABoissonneault

+0

@KABoissonneault 맞습니다. 보편적 인 참조를 사용한다면'std :: decay'를 사용해야합니다. , 나는 대답을 업데이트했다. – Holt

+0

나는 그 질문을 이해하지 못했고 따라서 대답을하지 못했다. 'auto a (:: close, 1)'라고 말할 수있는 전체 목표는 무엇입니까? – Assimilater

11

템플릿 클래스의 인수를 기본값으로 설정하지 않으면 생략 할 수 없습니다. 당신이 할 수있는 것은 인수를 추론하고이 인수를 템플릿 클래스에 전달하여 적절한 인스턴스화의 객체를 반환하는 maker 함수를 갖는 것입니다.

template<typename F, typename... Args> 
A<F> make_A(F f, Args&&... args) { 
    return A<F>(f, std::forward<Args>(args)...); 
} 
15

덕분에, 당신은 쓸 수 있습니다 당신을 위해 공제를 수행

template <class F, class... Args> 
A<std::decay_t<F>> make_a(F&& f, Args&&... args) { 
    return {std::forward<F>(f), std::forward<Args>(args)...}; 
} 

auto a = make_a(::close, 1); 

이 좀 장황하지만, 적어도 당신의 효율성에 대해 걱정할 필요가 없습니다 - 여기 망막 정맥 폐쇄하는 감사를 만든 더 복사가되지 않습니다.

+1

Re : C++ 17 : 정말 이상합니다. 최소한 A a (:: close, 1);'라고 써야합니다. 나는 그것에 익숙해 질 것 같지만. . . – ruakh