【问题标题】:template struct passed by ref to void function由 ref 传递给 void 函数的模板结构
【发布时间】:2020-05-22 17:02:12
【问题描述】:

一段时间以来,我一直在努力解决这个问题,但就是想不通。

#include <iostream>

template<class T>
struct Vec3
{
    T x, y, z;

    Vec3(T _x, T _y, T _z) : x(_x), y(_y), z(_z) {}
};

template <class T>
void IncVec(Vec3<T>& vec)
{
    vec.x += 1;
}

int main(void)
{
    Vec3<float> vec = Vec3<float>(1, 2, 3);
    IncVec(vec);
    std::cout << vec.x;

}

我基本上想在 C# 中重新创建它。到目前为止,我得到了这个:

using System;

namespace cs_playground
{

    public struct Vec3<T>
    {
        public T x, y, z;
        public Vec3(T _x, T _y, T _z)
        {
            x = _x;
            y = _y;
            z = _z;
        }

    }

    class Program
    {

        public static void IncVec(ref Vec3<T> vec)
        {
            vec.x += 1;
        }


        static void Main()
        {
            Vec3<float> vec = new Vec3<float>(1, 2, 3);
            IncVec(ref vec);
            Console.WriteLine(vec.x);
        }
    }
}

它真的不喜欢 "ref Vec3" .. 我的意思是.. 它显然适用于 "ref Vec3" 等等.. 但我很难像.. 传递我猜的类型..

提前感谢您的任何帮助。

【问题讨论】:

  • public static void IncVec&lt;T&gt;(ref Vec3&lt;T&gt; vec)
  • 一般来说,不要试图将 C# 和 C++ 视为同一个东西。泛型不是模板。结构和类在两种语言中的含义不同,等等。
  • @JohnathanBarclay 我试过了,但它不允许我使用 + 运算符来表示 int + struct .. 我不能使用一些东西,我可以做一些类似 (ref vec...) where T : numeric或某事? ..
  • @Damien_The_Unbeliever 我会记住这一点。我刚开始玩 c# .. 谢谢你的信息。
  • 他们曾考虑过在某一时刻添加IArithmetic,但从未发生过。所以你不能用泛型类型做数学。

标签: c#


【解决方案1】:

主要问题是vec.x += 1 部分。 IncVec 应该能够接受任何类型的 T 并期望它能够添加 1。但是如果T 是一个布尔值呢? C# 中的布尔值不能加 1。还是随机类?

正如@Damien_The_Unbeliever 指出的那样,C++ 中的模板与 C# 中的泛型不同

但是,在 C# 中,您可以将约束添加到 T 类型,如下所示(还要注意方法名称后面缺少的 &lt;T&gt;):

public static void IncVec<T>(ref Vec3<T> vec)
   where T : xxxx // Constraints to the generic type
{
    vec.x += 1;
}

其中xxxx 可以是例如类型或接口的名称(这意味着类型T 必须继承或实现此类型)。也可以是 class 来表示 T 类型必须是一个类(然后例如 int 将不允许使用),或者它可以是 struct 以阻止使用类。

但是没有任何约束可以指定允许你使用我能想到的代码+= 1

【讨论】:

  • 没有可能的约束,因为 C# 目前存在,因为运算符是静态的,因此不能构成接口的一部分。
猜你喜欢
  • 2013-10-19
  • 2016-06-01
  • 1970-01-01
  • 2012-11-08
  • 2013-12-12
  • 1970-01-01
  • 1970-01-01
  • 2021-12-27
  • 2012-05-15
相关资源
最近更新 更多