2016-12-15 3 views
6

컴파일러가 알려진 값으로 내 ctor 중 하나를 호출 할 때 몇 가지 검사를하고 싶습니다. 그것을 감지하는 방법이 있습니까?SFINAE : 컴파일 시간 알려진 값으로 함수가 호출되는지 감지

그래서 사람이 전화 할 때 : 10 이후

A a (10); 

이 일정 알려진 컴파일 시간, 나는이 같은 특정의 ctor를 호출 좋아 :

template<int Value, typename = std::enable_if_t<Value <= 100>> 
A (int Value) {} 

내가 해결할 수있는 방법을 어떤 생각 이 문제? 감사합니다. 이처럼 사용할 수 있습니다, 그리고

struct A { 
    template<int v, std::enable_if_t<(v <= 100)>* = nullptr> 
    A(std::integral_constant<int, v>) {} 
}; 

:

답변

4

적분 상수는 문제를 해결할 수

A a{std:integral_constant<int, 7>{}}; 

사용의 용이성을 위해, 당신은 또한에 비슷한 사용할 수 있습니다 무엇을 boost::hana 않습니다. 불행하게도 그렇지 않은,

A a{76_c}; // the ""_c operator outputs an std::integral_constant<int, 76> 

당신은 아이디어에 대한 boost::hana documentation

+0

덕분에이 연산자에 대한 자세한 내용을보실 수 있습니다 : 그것은 중요한 상수로 숫자를 변환 리터럴 연산자를 정의합니다. 내 라이브러리의 정말 중요한 점은 단순한 기본 유형처럼 사용하기 쉽다는 것입니다. 99 %의 C++ 프로그래머는 integral_constant에 대해서조차 모릅니다. – Melkon

+4

이것은 실제로 아주 좋은 해결책입니다. +1, 나머지 99 %의 C++ 프로그래머들은'integral_constant'에 ​​대해 배워야합니다 :) 만약 당신이 단순히 컴파일시에 몇몇 상수의 값을 테스트하기를 원한다면이 경로를 따라갈 것입니다. 시각. – vsoftco

+0

@vsoftco 그게 문맥이야 : 나는 원시 타입을 기반으로 주장 (또는 다른 유형의 수표)을 대체하고 유형 정보에 넣는 것을 의미하는 불변의 lib에 대해 연구하고있다. 목표는 기본 유형만큼이나 단순하지만보다 효율적이고 효율적인 코드를 생성하는 것입니다. 이 integral_constant 버전은 좋은 추가 사항이지만 내 목표는 사용자가 생각할 필요없이 자동으로 물건을 최적화하는 것입니다. 물론 일부는 integral_constant를 사용하지만 대부분 사용하지는 않습니다. 솔직히 말해서 코드를 사용하면 코드가 더 멋지지 않을 것입니다. – Melkon