使用 C++ C# 中的 CLI 模板类

发布于 2024-07-16 15:00:27 字数 878 浏览 4 评论 0原文

我在 C++/CLI 中有以下类以及 int 原语的显式模板实例化。

template<typename T>
public ref class Number
{
    T _value;
public:
    static property T MinValue
    {
        T get()
        {
            return T::MinValue;
        }
    }

    static property T MaxValue
    {
        T get()
        {
            return T::MaxValue;
        }
    }

    property T Value
    {
        T get()
        {
            return _value;
        }

        void set(T value)
        {
            if( value<MinValue || value > MaxValue)
                throw gcnew System::ArgumentException("Value out of range");

            _value = value;
        }
    }

};

template ref class Number<int>;

在编译它并使用反射器检查生成的程序集时,我可以看到一个名为 Number 的类,但是当尝试在 C# 中实例化同一个类时,编译器抱怨某些 System::Number 类未采用模板参数。 我究竟做错了什么? 这完全可以做到吗?

I have the following class in C++/CLI and an explicit template instantiation for the int primitive..

template<typename T>
public ref class Number
{
    T _value;
public:
    static property T MinValue
    {
        T get()
        {
            return T::MinValue;
        }
    }

    static property T MaxValue
    {
        T get()
        {
            return T::MaxValue;
        }
    }

    property T Value
    {
        T get()
        {
            return _value;
        }

        void set(T value)
        {
            if( value<MinValue || value > MaxValue)
                throw gcnew System::ArgumentException("Value out of range");

            _value = value;
        }
    }

};

template ref class Number<int>;

On compiling this and inspecting the generated assembly using reflector I am able to see a class called Number<int> but while trying to instantiate this same class in C# the compiler complains about some System::Number class not taking a template argument. What am I doing wrong? Can this be done at all?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

眼泪淡了忧伤 2024-07-23 15:00:27

我有一个解决方法,声明一个继承 Number 类的附加类。 该类现在在 C# 中可见并且可以实例化。

public ref class MyInt32 : public Number<int>
{
};

I have a work around, declare an additional class inheriting the Number<int> class. This class is now visible in C# and can be instantiated.

public ref class MyInt32 : public Number<int>
{
};
那片花海 2024-07-23 15:00:27

反射器位于此处稍远一点。 类的名称实际上不是 Number。 它实际上是“Number”。 注意单引号。 仅当您使用 ildasm 查看类型名称时,这些才可见。

相信这样做是为了使类型在大多数语言中不可绑定,因为它们无法理解 C++ 模板的实际工作原理。 这使得它实际上只对 C++ 编译器可见,这是合适的,因为它是唯一真正支持模板(模板!=泛型)的 MS 编译器。

Reflector is lying a little bit here. The name of the class is not actually Number<int>. It is actually 'Number<int>'. Notice the single quotes. These are only visible when you view the type name with ildasm.

I believe this is done to make the type unbindable in most languages as they have no way of understanding how a C++ template actually works. This makes it effectively only visible to the C++ compiler which is appropriate since it's the only MS compiler that actually supports templates (templates != generics).

溺渁∝ 2024-07-23 15:00:27

如果您的目标是在 C++ CLI 中创建参数化类型,然后使用 C# 中的该类型,我认为您需要创建泛型类型而不是模板类型(请参阅 Stan Lippman 的博客 了解两种方法存在的原因)。 有关如何在 C++ CLI 中创建泛型类型的信息,请参阅此处

If your goal is to create a parametrized type in C++ CLI, and then use that type from C#, I think that you need to create a generic type rather than a template type (see Stan Lippman's Blog for the reasons why both methods exist). See here for information on how to create generic types in C++ CLI.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文