努力使用模板化结构选择类型



我有一个结构,我

声明如下:
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.事实是我从来没有这样做过,我不知道我应该如何使用这个结构。谁能帮我解决这个问题?

这里有一些问题。您声明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 */
}
template <typename T, typename U>
smu::Matrix<typename select<T, U>::type> operator*(
    const smu::Matrix<T>& a, const smu::Matrix<U>& b)

最新更新