2

我想将一个字符传递给我的函数(fn)。我不希望将整数和短裤类型转换到其中。所以我认为我应该将值隐式转换为 MyInt(仅支持 char)然后传递给 fn。这应该可以工作 bc IIRC 在传递给函数时只允许一个 typcast(所以 char->MyInt 可以,而 int->char->MyInt 不应该)。

然而,它似乎 int 和 char 都可以工作,所以我认为另一层间接(MyInt2)可以解决它。现在它们都不能传递给 fn ... 有没有办法让我可以传递字符但不能传递 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
}
4

3 回答 3

11

功能模板救援

template<typename T> void fn(T t);

void fn (char a){
    printf("%c", a);
}

如果有人尝试使用除参数fn以外的任何内容进行调用,char则函数模板将被选为匹配项,并且链接器将抱怨它找不到适当的特化。

于 2012-07-11T10:21:05.767 回答
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 */
};
于 2012-07-11T10:18:43.167 回答
4

您想char隐式转换为MyInt2which then to 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!

在线演示

实际上,您可以使用delete所有构造函数,但其​​中一个char为:

struct MyInt{
    //..
    MyInt(char vv); //ALLOW
 
    template<typename T>
    MyInt(T) = delete;  //DELETED the rest!
};

演示

学习更多关于 :

希望有帮助。

于 2012-07-11T10:42:01.833 回答