확인을위한 구조를 제공하려고 시도했습니다. A
은 (캐스팅 선택) - 캐스팅 가능 B
입니다. 네 개의 모든 캐스트는 정확히 동일한 구현을 가지며 이름이 필요합니다 (로컬 매크로 가능 정의가 가능할 수도 있지만 필요하지는 않음). 나는 많은 체크인을 위해 운영 구조, 예를 들어 쓴 :static/dynamic/const/reinterpret_cast를 평가되지 않은 컨텍스트에서 사용할 수 있습니까?
#include <iostream>
#include <type_traits>
#include <string>
template<class, class, class, class = void>
struct is_valid_ternary_operator : std::false_type
{ };
template<class T, class S, class R>
struct is_valid_ternary_operator <T, S, R,
std::void_t<decltype(std::declval<T>() ?
std::declval<S>() :
std::declval<R>())>> : std::true_type
{ };
int main()
{
//true? 1 : 0 //is ok
std::cout << is_valid_ternary_operator<bool, int, int>::value << std::endl;
//true? 1 : std::string("0") //would be error
std::cout << is_valid_ternary_operator<bool, int, std::string>::value << std::endl;
//true? std::string("1") : std::string("0") //ok
std::cout << is_valid_ternary_operator<bool, std::string, std::string>::value << std::endl;
//std::string("1")? 1 : 0 //error
std::cout << is_valid_ternary_operator<std::string, int, int>::value << std::endl;
}
예상 출력이 표시됩니다.
main.cpp:12:84: error: template argument 1 is invalid
(std::declval<T>()))>> : std::true_type
^~
main.cpp:12:94: error: template argument 3 is invalid
(std::declval<T>()))>> : std::true_type
^~~~~~~~~
이 평가되지 않은 상황에서 캐스트를 사용하지
을 허용 :template<class T, class S, class = void>
struct is_static_cast_able : std::false_type
{ };
template<class T, class S>
struct is_static_cast_able<T, S,
std::void_t<decltype(static_cast<std::declval<S>()>
(std::declval<T>()))>> : std::true_type
{ };
를하지만 오류가 발생 :하지만 지금 캐스트와 같은 일을 생각?
'static_cast'는'<>'대괄호 안에 * 유형 *이 있어야합니다. 'std :: declval
()'은 * 표현식 *입니다. 당신은 단지'static_cast(std :: decl())' –
aschepler