CLI / C ++函数重载

时间:2014-09-06 18:18:59

标签: c++-cli

我目前正在为CLI / C ++中的本机C ++类编写包装器。我现在正在上GamePacket课。考虑以下课程:

public ref class GamePacket
{
public:
    GamePacket();
    ~GamePacket();

    generic<typename T>
    where T : System::ValueType
    void Write(T value)
    {
        this->bw->Write(value);
    }
};

我希望我能够使用我的Wrapper在C#中调用该函数:

Packet.Write<Int32>(1234); Packet.Write<byte>(1);

但是,我无法编译我的包装器。错误:

Error 1 error C2664: 'void System::IO::BinaryWriter::Write(System::String ^)' : cannot convert argument 1 from 'T' to 'bool'

我不明白这个错误,System::String^来自哪里。我看到Write()方法有很多重载,CLI / C ++没有调用正确的方法,如果是这样,我怎样才能调用正确的方法呢?

参考MSDN:http://msdn.microsoft.com/en-us/library/system.io.binarywriter.write(v=vs.110).aspx

1 个答案:

答案 0 :(得分:1)

模板和泛型不起作用。

使用模板,代码会针对每组参数重新编译,结果可能会大不相同(选择不同的局部变量类型,不同的函数重载)。专业化使真正强大。

使用泛型,代码只编译一次,并且在不知道最终参数的情况下完成重载决策。因此,当您调用Write(value)时,编译器唯一知道的就是

  • value可以转换为Object^,因为一切都可以
  • value派生自ValueType,因为您的约束告诉它

不幸的是,仅使用该信息,编译器无法找到可以使用的Write重载。

似乎您希望Write(bool) T bool时使用Write(int)T int BinaryWrite::Write时使用{{1}},依此类推。模板会像那样工作。泛型没有。

您的选择是:

  • 您方法的十几个不同副本,每个副本都有一个固定的参数类型,可用于选择{{1}}的正确重载
  • 使用反射自己找到重载,使代理匹配正确的重载,然后调用它
  • 使用表达式树或动态语言运行库来查找匹配正确重载的委托,然后将其称为