template <typname {CStringA, CStringW} T>
int compare(const T s)
{
int c = compare(s.GetString());
return c;
}
template <typname {std::string, std::wstring} T>
int compare(const T s)
{
int c = compare(s.c_str());
return c;
}
<std::string>compare(std::strind("abcd")); //이런식으로 쓰면 안됨
compare(std::string("abcd")); //이런식으로 가능해야만 함
이런게 있다는건 아니고 이런식으로 지원해 줬으면 좋겠다는 나의 간절한 바람...
혹은 이미 있는데 나만 모르나?
오버로딩하세요
ㄴ 다시 생각하세요
오버로딩으로 될게 아닙니다
type_traits에 is_pointer 있어요
ㄴ 포인터 때문에 이러는것이 아닙니다.
true_type false_type갖고 패턴매칭하면 컴파일시간에 구분 가능함
님이 멀하고싶은지 모르겠음
"2개 이상"의 타입을 하나의 타입으로 그룹화해주고 제한적으로 오버로딩 함수를 생성하는데 효율적인 한정자가 필요한겁니다.
니가 하고싶은게 결국 제네릭 타입 T 에 대한 Covariance / Contravariance 를 컴파일 타임에 구현하고 싶다라는 걸로 보이는데, 템플릿 특수화를 통해 저 기능은 구현가능함.
좀 더 상위 버전의 언어 (C# / Java) 는 저거됨. 물론 Java 같은 쓰레기언어는 제네릭을 존나 병신같이 구현해놔서 제대로안됨. C# 이 완벽하게 해놓음.
ㄴ 가능하다면 예제좀
SO 에 질문글 올려놓으면 답변달아줄게.. 채택부탁한다.
+1 Upvote 도 부탁한다..
이해하는데 한참걸렸네..
아이디 노출되는거 시른뎅 -,.-;
.....내아이디도 노출되거든여...;;;
그니까 그냥 여기에 새글로 적어주삼 ㅋㅋ
저거 구현 간단하게 됨. 설명만 하자면, std::enable_if<bool, T> 랑 비슷하게 구현해서 std::wstring / std::string 을 판단하게 특수화하면됨
물론 진정한 의미에서의 정적 covariance 체크는 안되긴하겠지만.
ㄴ 내가 원하는 거랑은 약간 다른거 같은데.
될거 같아 보여도 실제 해보면 안될 수도 있고.
아참 compare함수 호출시에는 <>를 쓰면 안됨. 컴파일러가 추론해서 자동으로 해줘야함. 그게 핵심
특수화로 하면 안되낭 ??
ㄴ특수화로 안될듯.
특수화로 되는거 같은데? 내가 질문을 잘 못 이해했나??
ㄴ혹시 될거 같으시면 간단한 구현 후 새글로 올려주시면 감사하겠습니다.
CStringA, CStringW 타입이 같은 함수가 불리고 싶다??
ㄴ 부끄럽긔... 내가 질문을 잘 못 이해한거 같긔
타입이 전혀 다른. 즉 완전히 다른 클래스 이더라도. 동일한 멤버 함수만 존재한다면 그룹화에 참여 할 수 있어야 합니다.
ㄴ 아.. 잘못이해했네 ㅋㅋㅋ
하스켈 타입클래스 같은건가
윗분말대로 sfinae로 쥐짜면 나오긴 하는데 코드가 넘 길듯
#include <iostream>using namespace std;template<typename T>struct has_hello{ template<typename U,void (U::*)()> struct HELPS; template<typename U> static char Test(HELPS<U,&U::hello>*); template<typename U> static int Test(...); const static bool Has = sizeof(Test<T>(0)) == sizeof(char);};struct A{ void hello(){} };cout<<has_hello<A>::Has<<endl;
ㄴ ㅋㅋㅋ 뭐냐 이거 복사 해서 써봥
인터넷에서 퍼옴
http://www.programkr.com/blog/MMDO5ADMwYT3.html
이런거임 ??
함수 체크는 컴파일 타임에 가능하니까, 그 이후에 불라 ~ 불라 하면 되는거 아녕?
ㄴ 안타깝게도 아닙니다.
원하는게 맞는겨? 아닌겨 ? 궁금하네 ㅋㅋ 그리고 저거 public 함수에 대해서만 체크 가능하넹 ?;
-_- 이런 ㅠㅠ
인터페이스 클래스가 개입되어야 하기때문에 그러면 실사용시 또 코드가 길어져서....
기존 호출 코드에 영향을 주지 않고 정의부분만 조작해서 마무리가 되어야 하는것도 중요 포인트입니다.
사실 그냥 오버로딩해서 쓰면 되는데 중복코드가 생겨서 코드가 길어지는게 싫은거니까요.
C++에 질문하신분이 필요한 기능에 딱맞는건 없는듯
http://ideone.com/LHG3cP
ㄴ 매크로 사용 해서 해결하는것은 좋지만. 코드 구현이나 수정시 백슬러시를 일일히 해줘야 한다는 귀차니즘이 있군요.
암튼 아쉬운데로 매크로 쪽으로 쓰는것이 좋을지도
디버깅도 좀 불편하고 인텔리센스도 불편하고..흠...