C ++显式char / short?

时间:2012-07-11 10:16:02

标签: c++

我想将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
}

3 个答案:

答案 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!
};

Demo

详细了解:

希望有所帮助。