c# - 由 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>”等等..但我很难像..传递我猜想的类型..
感谢您提前提供任何帮助。
解决方案
主要问题是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
我能想到的代码。
推荐阅读
- macos - Xamarin Mac 显示弹出窗口
- java - 离线同步文件:上传 ArrayList 或在 for 循环中上传
- python - TextField 对象不可调用 | Python Django 和身份验证 | 默认文件不起作用
- sql - 在特定组之后在 SQL 输出中动态创建行
- javascript - 添加新行时在javascript上添加不起作用
- mediawiki - 如何在基于 MediaWiki 的 wiki 中搜索使用模板“underconstruction”并标有“abcd”的页面?
- java - 如何使用基本身份验证创建具有适当权限的用户以列出 kubernetes v1.13 中的命名空间
- c++ - c++ Grpc::CompletionQueue 构造速度在14k左右?
- sql - 如何为现有表中的每一行插入索引
- java - 如何通知客户端有关 Rest Endpoint 的更改