假设我有几个这样定义的函数:
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
成为int
或 bool
并且代码仍会编译,静静地引入错误。
最佳答案
(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**
是错误的类型那么大概你会在其他地方得到错误,不管怎样。
我想这取决于您所说的“悄悄引入错误”是什么意思。目前尚不清楚您要防止出现哪种错误。我可以想出一个人为的例子,但人为的例子很少代表现实世界的危险。
两个旁注:
- 您的专业语法不正确。应该是
template <> inline void read<bool>(bool **data) { /* ... */ }
例如。 - 这里根本不需要模板,您可以只重载三个函数。具有显式特化的未定义模板函数是一种反模式;重载是实现同一事物的推荐方法。
关于c++ - 结合模板和类型安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44986860/