gpt4 book ai didi

c++ - 如何避免对非构造函数进行隐式转换?

转载 作者:IT老高 更新时间:2023-10-28 12:37:04 24 4
gpt4 key购买 nike

如何避免对非构造函数进行隐式强制转换?
我有一个以整数为参数的函数,
但该函数也将接受字符、 bool 值和长整数。
我相信它是通过隐式转换它们来做到这一点的。
如何避免这种情况,使函数只接受匹配类型的参数,否则将拒绝编译?
有一个关键字“explicit”,但它不适用于非构造函数。 :\
我该怎么办?

以下程序可以编译,但我不希望它编译:

#include <cstdlib>

//the function signature requires an int
void function(int i);

int main(){

int i{5};
function(i); //<- this is acceptable

char c{'a'};
function(c); //<- I would NOT like this to compile

return EXIT_SUCCESS;
}

void function(int i){return;}

*请务必指出任何滥用术语和假设的地方

最佳答案

定义匹配所有其他类型的函数模板:

void function(int); // this will be selected for int only

template <class T>
void function(T) = delete; // C++11

这是因为具有直接匹配的非模板函数总是首先被考虑。然后考虑直接匹配的函数模板 - 所以永远不要function<int>将会被使用。但对于其他任何内容,例如 char,function<char>将被使用 - 这会给你的编译错误:

void function(int) {}

template <class T>
void function(T) = delete; // C++11


int main() {
function(1);
function(char(1)); // line 12
}

错误:

prog.cpp: In function 'int main()':
prog.cpp:4:6: error: deleted function 'void function(T) [with T = char]'
prog.cpp:12:20: error: used here

这是 C++03 方式:

// because this ugly code will give you compilation error for all other types
class DeleteOverload
{
private:
DeleteOverload(void*);
};


template <class T>
void function(T a, DeleteOverload = 0);

void function(int a)
{}

关于c++ - 如何避免对非构造函数进行隐式转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12877546/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com