2016-10-19 6 views
2

공장 기능에 생성자 서명을 해결하기 위해 그것을 자르지 않은 구조물. solution for resolving a member function에는 SFINAE가 포함되어 있습니다 (멤버 함수의 decltype은 실패합니다).하지만 고유 한 서명 유형이 없으므로 생성자에서는이 기능이 가능하지 않습니다.어떻게 아래 <code>create(...)</code> 기능에 해당 인스턴스를 생성 할 때 클래스 <code>T</code>의 생성자의 두 가지 서명 중 하나는 지원하려는

C++ 11에서도 가능하며 라이브러리를 지원합니까?

+0

는 것을'새 D'가 아닌'새로운 T'을 있어야하는데? – krzaq

+2

'std :: is_constructible'을 사용해 보셨습니까? –

+0

@krzaq : 답이 고침이며 고맙습니다! – kkm

답변

5

그냥 std::is_constructible 사용

namespace detail 
{ 
template<typename T, typename... Ts> 
auto create(std::true_type, Special* s, Ts&&... args) { 
    return new T(s, std::forward<Ts>(args)...); 
} 

template<typename T, typename... Ts> 
auto create(std::false_type, Special*, Ts&&... args) { 
    return new T(std::forward<Ts>(args)...); 
} 

} 

template<class T, typename... Args> 
T* create(Special* s, Args&&... args) { 
    using tag = is_constructible<T, Special*, Args...>; 
    return detail::create<T>(tag{}, s, std::forward<Args>(args)...); 
} 

live demo

4
template <class Т, typename... Args> 
T* create_impl(std::true_type, Special* s, Args&&... args) { 
    return new T(s, std::forward<Args>(args)...); 
} 
template <class Т, typename... Args> 
T* create_impl(std::false_type, Special*, Args&&... args) { 
    return new T(std::forward<Args>(args)...); 
} 

template <class Т, typename... Args> 
T* create(Special* s, Args&&... args) { 
    T* t = create_impl<T>(std::is_constructible<T, Special*&, Args&&...>{}, 
         s, std::forward<Args>(args)...); 
    // ... 
    return t; 
} 
+0

'Special *'의 끝에이 작은 '&'터치가 마음에 듭니다. :) – kkm

+0

@kkm는's'을 전달하지 않는다해도 문제가되지 않습니까? – krzaq

+0

@krzaq : 아마도 맞을 것입니다. 이제 나는 혼란 스럽다. T.C. 이걸 분명히 해 주시겠습니까? – kkm