c++ - 结合模板和类型安全

标签 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)那会调用合适的read<T>(T **data)基于类型 T 的实现,对吗?

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

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

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

确保我调用了 double 的实现?

我知道如果没有 <double> 我会得到相同的结果部分,但通过这种方式我确保将 double 传递给函数,就像在没有 <double> 的情况下那样做将允许 d成为intbool并且代码仍会编译,静静地引入错误。

最佳答案

(1)That would call the appropriate read<T>(T **data) implementation based on the type T, right?

是的,假设特化在 read<T>(data) 处可见遇到了。

(2)If I were to specify a type that is not one of the three above, I'd get a compilation error, since that function is not defined, right?

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

(3)Also, can I make this call:

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

to ensure that I called the implementation for double?

不过你可以<double>是多余的,将被推断。

... silently introducing an error.

如果您传递的是 bool**那么使用 bool不是是一个错误特化。我真的看不到显式提供模板参数有任何好处。如果bool**是错误的类型那么大概你会在其他地方得到错误,不管怎样。

我想这取决于您所说的“悄悄引入错误”是什么意思。目前尚不清楚您要防止出现哪种错误。我可以想出一个人为的例子,但人为的例子很少代表现实世界的危险。


两个旁注:

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

关于c++ - 结合模板和类型安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44986860/

相关文章:

C++ 将索引绑定(bind)到一个数据结构

haskell - 提高协程请求类型的安全性

c++ - 将 Rcpp 与 C 代码链接起来以进行自适应大都会拒绝采样

c++ - 从工作目录中的文件夹读取 C++

c++ - 模板名和类模板名的区别

javascript - 如何将 javascript 源文件插入到我的 Pyramid python 应用程序中并在我的模板中使用它们?

c++ - C++中new的使用

c++ - try_lock() +unlock() 是检查 boost::interprocess::file_lock 是否被锁定的有效方法吗?

c++ - 使用 SFINAE 和 void_t 确定容器内元素的类型

java - Java 集合中更好的类型安全性