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

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

最佳答案

这里有一些错误。你声明的方式 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 */
}

关于c++ - 努力使用模板化结构选择类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36840423/

相关文章:

c++ - OpenGL 纹理导致 ImGUI 窗口永久失焦

c++ 如何从 .dat 文件构建字符串的二维矩阵? 5 列 x 行

c++ - 在 C++ 中,如何获取一个程序的输出并将其用作另一个程序的输入?

c++ - 如何从 C++ 中的另一个模板函数重新转换模板函数

c# - 如何排除嵌套括号内的正则表达式匹配

C++ 循环依赖

c++ - isAbstract 模板和 Visual Studio

c++ - 策略类设计但没有将整个用户类作为模板

java - 像这样嵌套 try/finally 子句安全吗?

r - 在 map2 中映射 - 如何正确引用参数(purrr)