苦苦于使用模板化结构选择类型

时间:2016-04-25 12:21:20

标签: c++ templates nested c++03

我有一个我声明的结构:

template <typename T, typename U> struct select_type;

我专注于:

template <> struct select_type<float, double>
{
  typedef double type;
};

对于<double, float><int, float> ......

等几种类型,等等

我在一些模板化的函数中使用它,如:

template <typename T, typename U, typename select<T,U>::type R >
smu::Matrix<R> operator*(const smu::Matrix<T>& a, const smu::Matrix<U>& b)
{
/* code here */
}

我尝试了多种方式来使用它,没有R,没有typename但是大多数时候我有一个错误要求nested-name parameter before select。事实是我从来没有这样做过,我不知道应该如何使用这种结构。任何人都可以帮我这个吗?

2 个答案:

答案 0 :(得分:2)

这里有一些问题。您宣布R的方式:

typename select<T,U>::type R 

select<T,U>::type类型的。这不是您想要的 - 您希望R成为类型。其次,R是一个非推导的上下文 - 它是一个模板参数,未在任何参数中指定,因此无法推断,只能明确指定。但是你无法真正明确地指定它,因为无论如何都会失去方便的operator*

在C ++ 11及更高版本中,您可以将其设为默认类型参数:

template <typename T, typename U, typename R = typename select<T,U>::type>
smu::Matrix<R> operator*(const smu::Matrix<T>& a, const smu::Matrix<U>& b)

但是在C ++ 03中,你不能拥有默认的函数模板参数,所以你只需写出来:

template <typename T, typename U>
smu::Matrix<typename select<T,U>::type> operator*(const smu::Matrix<T>& a,
    const smu::Matrix<U>& b)
{
    typedef typename select<T,U>::type R;

    /* rest as before */
}

答案 1 :(得分:1)

template <typename T, typename U>
smu::Matrix<typename select<T, U>::type> operator*(
    const smu::Matrix<T>& a, const smu::Matrix<U>& b)