2014-11-29 3 views
0

(<) 연산자가 정의되지 않은 유형이 'myclass'로 전달되면 예외를 throw하려고합니다. 내가하고 싶은 것을 설명하기 위해 몇 가지 샘플 코드를 추가했습니다.특정 연산자가 C++의 템플릿에 정의되어 있는지 어떻게 확인합니까?

template<typename T> 
class CLASS { 
public: 
    CLASS() 
    { 
     //if('T' does not have '<' operator defined) 
     //{ 
     // throw exception; 
     //}  
    } 

private: 
    T mProperty; 
}; 

class PlainClass { 
public: 
    PlainClass() {} 
private: 
    int num = 0; 
}; 

int main() 
{ 
    CLASS<int> ok;    //ok 
    CLASS<PlainClass> error; //throws exception 

    return 0; 
} 

향후 시청자를위한 참고 사항 : Nacl의 질문에 대한 대답으로 문제가 해결되고 Columbo는보다 세련된 솔루션을 제공합니다.

+7

왜 예외를 사용하려면

namespace somenamespace { typedef char no[7]; template<typename T> no& operator<(const T&, const T&); template<typename T> struct checker { enum { value = (sizeof(*(T*)(0) < *(T*)(0)) != sizeof(no)) }; }; } template<typename T, bool> struct CLASS_helper { CLASS_helper(){/*some cool constructor*/} }; template<typename T> struct CLASS_helper<T, false> { CLASS_helper() { std::string str("No operator< specified for "); str += typeid(T).name(); str += ".\n"; throw std::logic_error(str); }; }; template<typename T> using CLASS = CLASS_helper<T, somenamespace::checker<T>::value>; 

? 템플릿은 컴파일 타임에 컴파일러 오류가 없을까요? – Suma

+0

나는 그것이 가능하지 않다고 생각한다. 유효한 연산자가 없으면 컴파일러는 컴파일을 허용하지 않습니다. – BWG

+0

과제에 여분의 점수를 받기를 원한다면 예외를 던질 필요가 있다고 들었습니다 ... 그래서 여기에있을 것이라고 추측했지만 잘못되었습니다. 귀하의 의견을 보내 주셔서 감사합니다. –

답변

1

매우 쓸모가 없습니다. 런타임에는 예외가 발생하고 템플릿은 컴파일 타임에 작동하므로 예외를 확인하기위한 용도가 없습니다. Columbo가 언급 한대로 static_assert을 사용하십시오.

그러나이 같은 예를 들어 그것을 할 수 있습니다 :이 당신이 할

try 
{ 
    CLASS<Foo> c; 
} 
catch(std::exception& e) 
{ 
    std::cout << e.what(); 
} 
+0

니스, 내 질문에 직접 대답합니다. –

4

컴파일시에 static_assert을 사용할 수있는 경우 예외가 발생하는 이유는 무엇입니까?

template <typename T, typename=void> 
struct LessThanComparable_ : std::false_type {}; 

template <typename T> 
struct LessThanComparable_<T, 
    decltype(void(std::declval<T>() < std::declval<T>()))> 
    : std::true_type {}; 

template <typename T> 
using LessThanComparable = LessThanComparable_<T>; 

사용 예제 :

static_assert(LessThanComparable<std::string>::value, ""); 
static_assert(LessThanComparable<int>::value, ""); 
static_assert(!LessThanComparable<std::ostream>::value, ""); 

Demo. 템플릿 매개 변수와 동등한 작업 :

template <typename T> 
struct MyTemplate 
{ 
    static_assert(LessThanComparable<T>::value, 
        "Invalid type - must have less-than operator implemented"); 
}; 
+1

심지어 왜 단정합니까? 컴파일을 시도하고 클래스에'< '연산자가 없으면 컴파일 오류 만 발생합니다. 추가 작업이 필요하지 않습니다. – CoryKramer

+1

@Cyber ​​OP가 일종의 적절한 오류 메시지를 표시 할 의도가 아니 었습니까? – Columbo

+1

예, 컴파일러 오류로 인해 'error for call to ...에 대한 오류가 없습니다'와 같은 말을하고 불쾌한 줄을 직접 가리킬 것입니다. 그것보다 명확하지 않습니다. – CoryKramer