저는 C++ 템플릿을 처음 사용합니다. 두 개의 다른 템플릿 클래스를 조작 할 수있는 함수 집합을 작성했습니다. 하나는 항상 가치에 의해 전달되어야하며, 다른 하나는 거대한 양의 데이터를 나타 내기 때문에 참조로 전달되어야합니다.c 템플릿 함수 매개 변수 유형 선택
다음은 단순화 된 예입니다. arg가 ref 타입으로 태그가 붙어 있다면, 함수 시그니처를 const ref로 가져 오도록 정의하고 싶습니다.
template<bool B, typename, typename T2>
struct if_ {};
template<typename T1, typename T2>
struct if_<true, T1, T2> {
typedef T1 type;
};
template<typename T1, typename T2>
struct if_<false, T1, T2> {
typedef T2 type;
};
struct ByvalTypeTag {};
template<typename T>
class Byval : public ByvalTypeTag
{
T somedata;
};
struct ByrefTypeTag {};
template<typename T>
class Byref : public ByrefTypeTag
{
T somedata;
};
template<typename T>
void myfunc(typename if_<std::is_base_of<ByrefTypeTag, T>::value, const T&, T>::type arg)
{
}
int _tmain(int argc, _TCHAR* argv[])
{
Byref<int> arg;
myfunc(arg);
return 0;
}
내가 오류는 다음과 같습니다
오류 C2783 : '무효 myfunc에 (있는 경우 _ :: 값, CONST T &, T> :: 형)': 'T'에 대한 템플릿 인수를 추론 할 수 없었다
어쩌면 이것이 잘못된 방법 일 것입니다. 가능하다면 동일한 기능을 위해 작성중인 상대적으로 중복되는 템플릿의 수를 줄이려고합니다.
컴파일러는'myfunc'의 인수에서'T'을 추론 할 수 없습니다가, 식 (그리고 템플릿 인스턴스화를 통해 이전 버전과 유형을 infering하는 것은 일반적으로 중단 문제를 해결 필요할 수) 너무 복잡하다. ..당신은 타입을 명시 적으로'myfunc < Byref> (arg)'로 제공해야한다. (또는 누군가가 원하는 것을하기위한 다른 까다로운 방법을 찾을 수있다. 그러나 그것은 가장 직접적인 해결책이다.) –