我有一个功能:
int foo(void * ptr)
{
// ...
}
我可以在语法上(不带有编译器警告等)在C ++ 11/14中禁用除void *
自身以外的指针传递吗?
例如,现在可以这样称呼它:
foo(new int(42));
我需要禁用此功能。
您可以将函数转换为模板,然后使用static_assert
和std::is_void
来type_traits
:
template<typename T>
int foo(T *ptr) {
static_assert(std::is_void<T>::value, "!");
// ....
}
否则,可以使用std::enable_if_t
on返回类型:
template<typename T>
std::enable_if_t<std::is_void<T>::value, int>
foo(T *ptr) {
// ....
return 0;
}
依此类推,其他用户已经用他们的答案提出了其他有趣的解决方案。
这是一个最小的工作示例:
#include<type_traits>
template<typename T>
int foo(T *ptr) {
static_assert(std::is_void<T>::value, "!");
// ....
return 0;
}
int main() {
int i = 42;
void *p = &i;
foo(p);
// foo(&i); // compile error
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句