【问题标题】:CLI/C++ Interface class, Generic method calling template methodCLI/C++接口类,通用方法调用模板方法
【发布时间】:2015-11-23 08:34:25
【问题描述】:

我目前正在编写一个构建桥梁的接口包装类 在托管代码和 c++ 类之间。因为这个 c++ 类确实导出 模板方法我在调用它们时遇到了一些麻烦。我要曝光 一个泛型方法,然后调用相应的模板方法。

在下面的示例中,我想公开 AppendData,它调用 _AppendData, 然后调用模板方法。

我收到 _AppendData 调用的编译错误: 错误 1 ​​错误 C2664: 'void managedInterface::Channel::_AppendData(cli::array ^)' : 无法将参数 1 从 'cli::array ^' 转换为 'cli::array ^' d:\sources\something\一些出口.h 421 1

我做错了什么?

generic <typename T> void AppendData ( array<T> ^aArray)
    {
        _AppendData(aArray);
    }

internal:
    void _AppendData(array<char>                ^aArray);
    void _AppendData(array<short>               ^aArray);
    void _AppendData(array<int>                 ^aArray);
    void _AppendData(array<long long>           ^aArray);
    void _AppendData(array<unsigned char>       ^aArray);
    void _AppendData(array<unsigned short>      ^aArray);
    void _AppendData(array<unsigned int>        ^aArray);
    void _AppendData(array<unsigned long long>  ^aArray);
    void _AppendData(array<float>               ^aArray);
    void _AppendData(array<double>              ^aArray);

    template <typename T> void __AppendData(array<T> ^aArray)
    {

    }

【问题讨论】:

    标签: templates generics c++-cli


    【解决方案1】:

    您的语法不起作用的原因很简单:泛型在运行时被具体化,而模板在编译时被实例化。这意味着_AppendData(aArray); 的重载解析必须在编译时执行,但aArray 的类型要到运行时才能知道。这两种情况是不相容的。

    恐怕没有比这更好的解决方案了:

    generic <typename T> void AppendData(array<T>^ aArray)
    {
        if (dynamic_cast<array<char>^>(aArray) != nullptr)
        {
            _AppendData(safe_cast<array<char>^>(aArray));
            return;
        }
    
        if (dynamic_cast<array<short>^>(aArray) != nullptr)
        {
            _AppendData(safe_cast<array<short>^>(aArray));
            return;
        }
    
        // Do the same for the other ones
    
        throw gcnew System::NotSupportedException(System::String::Format("Unsupported type: {0}", T::typeid));
    }
    

    除非由于 MSVC 错误,此代码无法编译:/

    错误 C2681:'cli::array&lt;T, 1&gt; ^':dynamic_cast 的表达式类型无效

    所以我们必须解决这个问题:

    template <class T> bool is_instance_of(System::Object^ obj)
    {
        return dynamic_cast<T>(obj) != nullptr;
    }
    
    generic <typename T> void AppendData(array<T>^ aArray)
    {
        if (is_instance_of<array<char>^>(aArray))
        {
            _AppendData(safe_cast<array<char>^>(aArray));
            return;
        }
    
        if (is_instance_of<array<short>^>(aArray))
        {
            _AppendData(safe_cast<array<short>^>(aArray));
            return;
        }
    
        // Do the same for the other ones
    
        throw gcnew System::NotSupportedException(System::String::Format("Unsupported type: {0}", T::typeid));
    }
    

    【讨论】:

    • 非常感谢!没有考虑dynamic_casting。 :) 现在我唯一剩下的问题是我不传递数组的函数,而是一个简单的类型,比如(int,char ...)。这里没有动态转换...:/
    • 这是您可以应对的事情:我刚刚添加了an answer here - 您有两种解决方案可供选择。 :-)
    猜你喜欢
    • 2011-05-18
    • 1970-01-01
    • 1970-01-01
    • 2011-02-17
    • 1970-01-01
    • 2011-09-04
    • 2013-03-07
    • 1970-01-01
    • 2015-02-25
    相关资源
    最近更新 更多