어떻게 든 템플릿 매개 변수의 맵을 만들 수 있습니까? 다음과 같은 기능이 있다고 가정 해 보겠습니다.
template<typename T>
T SumCoefficients(const std::vector<T>& coeffs) {
T sum = static_cast<T>(0);
for(int i=0; i<100; ++i) {
sum += SomeFunc<T>(i) * coeffs[i];
}
return sum;
}
// explicit instantiation
template double SumCoefficients(const std::vector<double>& coeffs);
template float SumCoefficients(const std::vector<float>& coeffs);
template Vector3d SumCoefficients(const std::vector<Vector3d >& coeffs);
이제 호출하고 싶지 SomeFunc<T>(i)
않지만 대신 T == float이면을 사용 SomeFunc<float>
하고 T == double SomeFunc<double>
이면 사용 하고 싶지만 T == Vector3d이면 사용하고 싶지 SomeFunc<Vector3d>
않지만 대신 사용하고 싶습니다.SomeFunc<double>
이제는 물론 명시 적으로 구현 template <> Vector3d SumCoefficients(std::vector<Vector3d > coeffs) { ... }
한 다음를 명시 적으로 호출 할 수 SomeFunc<double>
있지만 단일 템플릿 구현과 명시 적 인스턴스화만으로 동일한 결과를 제공하는 우아한 방법이 있는지 궁금합니다.
접근 방식이 괜찮은 경우 constexpr이지만 SomeFunc
코드 기반에 대한 호출이 많은 경우 선호하는 다른 솔루션을 추가하고 싶습니다 .
내 솔루션의 또 다른 장점은 매핑 논리가 호출 코드가 아니라 템플릿 전문화에 캡슐화되어 있기 때문에 유형이 많거나 나중에 유형을 추가 할 수 있어야하는 경우 더 잘 확장된다는 것입니다.
의미 론적으로 원하는 것은 다음과 같은 스칼라 유형이라고 가정합니다 T
.
template<typename T>
struct scalar_type {
using type = T;
};
template<typename T>
using scalar_t = typename scalar_type<T>::type;
이제 모든 유형의 벡터 또는 행렬 또는 필요한 모든 항목에 대해이 템플릿의 구분을 추가 할 수 있습니다.
template<>
struct scalar_type<Vector3d> {
using type = double;
};
호출 코드는 다음과 같습니다.
template<typename T>
auto SumCoefficients(const std::vector<T>& coeffs) {
scalar_t<T> sum;
for(int i=0; i<100; ++i) {
sum += SomeFunc<scalar_t<T>>(i) * coeffs[i];
}
return sum;
}
C ++ 11로 제한된 경우 호출 사이트는 다음과 같을 수 있습니다.
template<typename T, typename Scalar = scalar_t<T>>
Scalar SumCoefficients(const std::vector<T>& coeffs) {
Scalar sum;
for(int i=0; i<100; ++i) {
sum += SomeFunc<Scalar>(i) * coeffs[i];
}
return sum;
}
여기에서 전체 예보기
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다