我想将char传递给我的函数(fn)。我不希望整数和短路被强制转换成它。所以我想我应该将值隐式地转换为MyInt(它只支持char)然后传入fn。这应该工作bc IIRC在传递到函数时只允许一个typcast(所以char-> MyInt是正确的,而int-> char-> MyInt不应该)。
然而它似乎int和char都工作,所以我想另一层间接(MyInt2)会解决它。现在他们都不能被传递到fn ......有没有办法让我可以传入chars而不是int?
#include <cstdio>
struct MyInt2{
int v;
MyInt2(char vv){v=vv;}
MyInt2(){}
};
struct MyInt{
MyInt2 v;
MyInt(MyInt2 vv){v=vv;}
};
void fn(MyInt a){
printf("%d", a.v);
}
int main() {
fn(1); //should cause error
fn((char)2); //should NOT cause error
}
答案 0 :(得分:11)
Function templates to the rescue:
template<typename T> void fn(T t);
void fn (char a){
printf("%c", a);
}
如果有人试图使用fn
参数以外的任何内容调用char
,则会选择函数模板作为匹配项,链接器会抱怨它找不到合适的专业化。
答案 1 :(得分:9)
您可以使用多态并定义多个版本,一个接受int
和一个short
并抛出异常或导致断言失败,或者隐藏构造函数:
struct MyInt2{
int v;
MyInt2(char vv){v=vv;}
MyInt2(short s) { throw "short"; } /* exception, runtime error */
MyInt2(){}
private:
MyInt2(int v) { } /* hidden, compile time error */
};
答案 2 :(得分:4)
您希望char
隐式转换为MyInt2
,然后转换为MyInt
。但是语言规范不允许两级转换。
如果您想进行一级隐式转换,那么C ++ 11可以为您提供帮助。
在C ++ 11中,delete
构造函数可以int
,允许使用char
的构造函数:
struct MyInt{
int v;
MyInt(char vv) : v(vv) {} //use mem-initialization list
MyInt(int) = delete; //VALID only in C++11
};
注意已删除的构造函数,该构造函数需要int
,这意味着:
MyInt m1(10); //error - can't accept int!
MyInt m2((char)10); //okay - can accept char!
请参阅Online Demo
事实上,你可以delete
所有构造函数,除了char
作为:{/ p>
struct MyInt{
//..
MyInt(char vv); //ALLOW
template<typename T>
MyInt(T) = delete; //DELETED the rest!
};
详细了解:
希望有所帮助。