结合模板和类型安全

时间:2017-07-08 13:39:19

标签: c++ templates type-safety

假设我有几个这样定义的函数:

template <typename T>
inline void read<bool>(T **data) {
    //some code
}

template <typename T>
inline void read<double>(T **data) {
    //some other code
}

template <typename T>
inline void read<int>(T **data) {
    //also different code
}

现在,我创建另一个定义如下的函数:

template<typename T>
inline void readMultiple(T **data, int counter) {
    for (int i = 0; i < counter, ++i) {
       read<T>(data);
    }
}

(1)那将根据类型T调用适当的read<T>(T **data)实现,对吗?

(2)如果我要指定的类型不是上述三种类型之一,我会收到编译错误,因为没有定义该函数,对吧?

(3)另外,我可以拨打这个电话:

double **d;
read<double>(d);

确保我调用double的实现?

我知道在没有<double>部分的情况下我会得到相同的结果,但是这样我确保将double传递给函数,而没有<double>的情况允许{ {1}}成为dint,代码仍会编译,无声地引入错误。

1 个答案:

答案 0 :(得分:1)

  

(1)那将根据类型T调用适当的read<T>(T **data)实现,对吗?

是的,假设在遇到read<T>(data)时可以看到专业化。

  

(2)如果我要指定的类型不是上述三种类型之一,我会收到编译错误,因为该函数未定义,对吧?

您尚未提供模板read()功能的声明,因此无法解答此问题。假设您已将其声明为template <typename T> void read(T**);并且未在任何地方定义,那么是,you would get a link-time error当链接器无法找到所请求的专业化的实现时。

  

(3)另外,我可以拨打这个电话:

double **d;
read<double>(d);
     

确保我调用double的实现?

你可以,<double>是多余的,并且会被推断出来。

  

......默默地引入错误。

如果你传递的内容是bool**,那么使用bool专业化会 错误 。我没有真正看到明确提供模板参数的任何好处。如果bool**是错误的类型,那么无论如何你可能会在其他地方遇到错误。

我想这取决于你的意思&#34;默默地引入一个错误。&#34;目前尚不清楚您试图阻止的错误类型。我可以想出一个人为的例子,但人为的例子很少代表现实世界的危险。

两个旁注:

  1. 您的专精的语法不正确。例如,它应该是template <> inline void read<bool>(bool **data) { /* ... */ }
  2. 这里根本不需要模板,你可以只有三个函数重载。具有显式特化的未定义模板函数是反模式;重载是实现同样事情的推荐方法。