首页 > 解决方案 > 由 ref 传递给 void 函数的模板结构

问题描述

一段时间以来,我一直在努力解决这个问题,但无法弄清楚这一点。

#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< T >”..我的意思是..它显然适用于“ref Vec3<float>”等等..但我很难像..传递我猜想的类型..

感谢您提前提供任何帮助。

标签: c#

解决方案


主要问题是vec.x += 1零件。IncVec应该能够采用任何类型并T期望它能够向其添加 1。但是如果T是一个布尔值呢?C# 中的布尔值不能加 1。还是随机班级?

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

但是,在 C# 中,您可以向类型添加约束,T如下所示(还要注意您<T>在方法名称后缺少):

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我能想到的代码。


推荐阅读