C++/cli에서 managed-> native converter를 구현하려고합니다. 변환 할 약 20 가지 유형이 있으므로 템플릿을 사용하려고합니다. 문제는 값 형식과 참조 형식을 다르게 처리해야한다는 것입니다. 여기 C++에서 제약 조건이있는 템플릿의 특수화
는 (. 적어도 그것은 컴파일이 코드는 OK입니다) 제가 구현하려고 해요 것은 :#define val_t_constraint(T) std::enable_if_t<std::is_integral<T>::value || std::is_floating_point<T>::value, T>
#define ref_t_constraint(T) std::enable_if_t<!std::is_integral<T>::value && !std::is_floating_point<T>::value, T>
template<class TElementIn, class TElementOut = TElementIn>
static val_t_constraint(TElementOut) convert(const TElementIn& native)
{
return (TElementOut)native;
}
template<class TElementIn, class TElementOut = TElementIn>
static ref_t_constraint(TElementOut)^ convert(const TElementIn& native)
{
return gcnew TElementOut();
}
template<class TElementIn, class TElementOut = TElementIn>
static array<val_t_constraint(TElementOut)>^ convert(const std::vector<TElementIn>& native)
{
auto arr = gcnew array<TElementOut>(1);
arr[0] = convert<TElementIn, TElementOut>(native[0]);
return arr;
}
template<class TElementIn, class TElementOut = TElementIn>
static array<ref_t_constraint(TElementOut)^>^ convert(const std::vector<TElementIn>& native)
{
auto arr = gcnew array<TElementOut^>(1);
arr[0] = convert<TElementIn, TElementOut>(native[0]);
return arr;
}
하지만이 같은 예를 들어, 일부 템플릿을 전문으로하기 위해 노력하고있어 때
template<>
static array<ref_t_constraint(Guid)^>^ convert(const std::vector<char>& native)
{
return gcnew array<Guid^>(1);
}
내가 오류 얻었다 "오류 C2912 : 명시 적 전문성 'CLI :: 배열^바즈 :: 변환 (const를 표준 : : 벡터> &를)'함수 템플릿의 특수화하지 않습니다."
사용하지 않는 함수 매개 변수를 통한 제약 조건 템플릿 함수의 특수화에 기본 매개 변수를 사용할 수 없습니다. 추가 템플릿 인수를 통한 제약 조건이 작동하지 않습니다. VC++ 120에서의 SFINAE 구현 때문에 나는 추측합니다.
이러한 솔루션을 구현할 수 있습니까? 어쩌면 내가 뭔가 잘못하고있는 걸까요? VC++ 120을 사용하고 있습니다.
'제약'이 아닌 'constaint'에 대한 확신이 있습니까? 그건 중요하지 않지만 영어 사용자는 혼란 스러울 수 있습니다. – Walter
값을 다루고 다르게 참조하기를 원한다면, 왜 각각의 형질 특성을 사용하지 않고, 완전히 관련이없는 (즉, 'is_integral'과'is_floating_point')? – Walter
@Walter "값 유형과 참조 유형을 다르게 처리하는"것을 보았을 때 int, float 또는 bool과 같은 기본 제공 단순 배열 유형을 원할 경우 C++ \ CLI에서 다음과 같이 작성해야합니다. gcnew array '^'없이() 다른 유형 (참조 유형)은 배열 구문 ('^'포함)을 사용하여 작성해야합니다. –