2016-09-12 2 views
1

C++ 놀이터에서 컨테이너를 가지고 놀고 있는데 기술적 인 문제가 있습니다.템플릿 멤버 함수 및 인수 전달

컨테이너에 emplace 메소드를 구현하려고합니다. 지금은 이미 구성한 요소를 가져 와서 할당 자 생성 메서드에 전달해야합니다.

나는 emplaceA 템플릿과 emplaceB1, emplaceB2 템플릿의 세 가지 방법으로 끝냈습니다. 모두 의도 한대로 작동합니다.

내 문제는 emplaceAArg이 단지 T 일 수 있음을 명시 적으로 나타내지 않습니다. emplaceB1, emplaceB2은 두 곳의 서로 다른 위치에서 거의 동일한 구현을 제공합니다 (결함으로 보입니다).

해결 방법이 있습니까?

template<class T, class A> class container { 
public: 
    using allocator_traits = typename std::allocator_traits<A>; 
... 
    template<class Arg> void emplaceA (int n, Arg&& arg){ 
     allocator_traits::construct(allocator_, data_+n, std::forward<Arg>(arg));}; 

    void emplaceB1(int n, const T& t){ 
     allocator_traits::construct(allocator_, data_+n, t);}; 

    void emplaceB2(int n, T&& t){ 
     allocator_traits::construct(allocator_, data_+n, std::move(t));}; 
... 
}; 
+2

C++에는 함수 오버로드가 있습니다. 즉, 같은 이름이지만 다른 인수를 가진 두 개 이상의 함수를 가질 수 있습니다. –

+1

이것은 아주 이상한 emplace 구현입니다. – SergeyA

+2

이것은'emplace'보다'push_back'처럼 보입니다. 이렇게하면'emplaceB1'과'emplaceB2'에 대해 기분이 나아질 경우 [std :: vector :: push_back'] (http://en.cppreference.com/w/cpp/container/vector/push_back)도 제공됩니다 같은 두 가지 맛. –

답변

0

템플릿 기능을 제한하려면 sfinae를 사용하여 원하지 않는 유형을 보내지 않도록 할 수 있습니다.

다음 예제에서는 ArgT으로 변환 될 때만 호출 가능하도록 템플릿 함수를 제한합니다. is_convertible은 두 유형이 같더라도 작동합니다. 당신이 보낸 형식이 엄격하게 T 있는지 확인하려면

template<class Arg, std::enable_if_t<std::is_convertible<Arg, T>::value, int> = 0> 
void emplaceA(int n, Arg&& arg){ 
    // ... 
} 

당신이 썩은 유형 std::is_same을 사용할 수 있습니다, 헤더를 물론 <type_traits>


를 포함하는 것을 잊지 마십시오.

template<class Arg, std::enable_if_t<std::is_same<std::decay_t<Arg>, T>::value, int> = 0> 
void emplaceA(int n, Arg&& arg){ 
    // ... 
} 
+0

감사합니다. 나는이 물건을 모른다. 그래서 나는 힌트를 볼 곳이있다. –

+0

@ JiříLechner''대답은 좋은 문서 페이지에 대한 링크입니다. ' – user4581301