在调用函数时阻止int的转换

bbv*_*van 4 c++ casting c++11

我有以下代码:

void foo(int64_t x) {}
void bar(int64_t* x) {}

int main() {
    int32_t a = 3;
    foo(a);
    bar(&a);
}
Run Code Online (Sandbox Code Playgroud)

当我尝试编译此,它给出了不能转换的错误int32_t*int64_t*,这是我想要的.

我尝试调用时是否可能出现类似的错误foo(a)

Edg*_*jān 7

作为一种解决方法,您可以使用已删除的版本重载foo:

void foo(int32_t x) = delete;
void foo(int64_t x) {}
Run Code Online (Sandbox Code Playgroud)

作为一个更通用的解决方案,您可以创建一个已删除的函数模板,然后将其专门用于int64_t(感谢@Someprogrammerdude):

template<typename T>
void foo(T) = delete;

template<>
void foo(int64_t x) {}
Run Code Online (Sandbox Code Playgroud)

有趣的是,它不能用clang 3.8编译,但是用clang 3.9gcc 6.2编译好.

  • 如果 OP 想要禁止除了 `int64_t` 参数函数之外的任何东西,那么可以使用模板和模板特化。 (5认同)