函数模板++/CLI
问题描述:
我尝试写一些函数模板在这样的一个C++/CLI命名空间:函数模板++/CLI
// header file
namespace MyCLI {
namespace MyFunctions {
template <typename T>
double sum(T a, T b) {
return (double) a + b;
}
}
}
的第一个问题是,当我编译该项目为一个dll,并尝试要使用它,名称空间MyFunctions不会显示出来。我认为,正在发生的事情,因为我还没有明确的实例化我的模板,我需要的所有类型,所以我添加下面的头文件的底部:
extern template double MyCLI::MyFunctions::sum<double>(double,double);
但是,这仍然不给我访问功能sum
为double
类型。我怀疑是因为项目被编译成托管代码,这是遵循C#的规则,你不能没有类没有功能。所以下次我试图做一个类的命名空间MyCLI内,使sum
类的这样的静态成员:
// header file
namespace MyCLI {
public ref class MyFunctions
{
public:
template <typename T>
static double sum(T a, T b) {
return (double) a + b;
}
};
}
extern template double MyCLI::MyFunctions::sum<double>(double,double);
现在,当我使用汇编我可以看到在MyCLI
的MyFunctions
类,但我仍然无法访问该类的sum
函数。
如果有人能给我任何关于如何解决这个问题的指示,或者我为什么首先面对这个问题,我将非常感激。
答
这不是显式实例化模板的正确语法。您需要删除extern
关键字并将实例化放在一个cpp文件中(而不是头文件),因此只定义一次。您无法看到该方法,因为由于缺少模板实例化而不存在。模板是而不是泛型,它们看起来很相似但有很大的不同。在编译时实例化,而泛型在运行时实现。
但是,如果你打算使用此代码从你的运气了不同的.NET语言:该方法将字面上包含尖括号中的名字,所以你会使用它没有打破也很难该语言的命名规则。你可以使用反射,但我相信这不是你想要的。
对于这种简单的情况,您可以简单地写几个重载(根本不使用模板),这是最简单的事情。如果你想要更多花哨的东西,请参阅my answer here获取灵感。