2016-08-09 7 views
1

나는 문제가 아니라 이론적 알고 있지만 자리가 예를 들어 같은 템플릿으로 정의 할 것인지 생각 : 사용과왜 형식이 아닌 템플릿 매개 변수를 사용하여 std :: bind의 placeholder가 구현되지 않았습니까?

namespace std { 
    namespace placeholders { 
     template <size_t> struct placeholder { constexpr placeholder() {}; }; 
     template <size_t N> constexpr placeholder<N> _{}; 
    } 
} 

:

std::bind(foo, std::placeholders::_<1>, std::placeholders::_<2>); 

또는 C++ 11 :

namespace std { 
    namespace placeholders { 
     template <size_t> struct _ { }; 
    } 
} 

코드는 그 명확성을 잃지 않을 것이며 우리는 그것을 사용하여 멋진 메타 프로그래밍을 할 수있을 것입니다. 그럼 ... std::bind의 자리 표시자가 비 형식 템플릿 매개 변수를 사용하여 구현되지 않은 이유는 무엇입니까?

+7

구문이 유효하지 않습니다. '_ <1>'도 여전히 타입이며, 타입으로 값을 전달할 수 없습니다 : 최소한 _{}'이 필요합니다. 또는 템플릿 struct placeholder {constexpr placeholder() {};}; 템플릿 constexpr 자리 표시 자 _ {};'? 그리고 2 등분 할 때, C++ 11에는 존재하지 않는 변수 템플릿이 필요합니다. 그래서, 당신은 무엇을 알고 싶습니까? – Yakk

답변

7

변수 템플릿이 C++ 11에 없으므로 언어에 std::bind이 추가되었습니다.

_1 여기서 이름은 짧으며 boost에서 가져온 것입니다. std::bind이 개발되었습니다.

쉽게 비슷한 자리 표시자를 작성할 수 있습니다.

namespace my_placeholders { 
    template <int> struct placeholder { constexpr placeholder() {}; }; 
    template <int N> constexpr placeholder<N> _{}; 
} 
namespace std { 
    template<int N> 
    struct is_placeholder< ::my_placeholders::placeholder<N> >: 
    std::integral_constant<int, N> 
    {}; 
} 

지금 my_placeholders::_<1> 모든 중요한 방법으로 _1에 유효한 std::bind 자리 표시 자와 동일합니다.

람다와 비교하여 std::bind을 사용하는 것이 얼마나 성가신지를 솔직히 감안할 때 아무도 표준 C++ 14에 실제로 이러한 기능을 추가 할 필요가 없습니다.