C++ Microsoft:如何将 uuid/guid 与模板专用化相关联
C++ Microsoft: How to associate uuid/guid with template specialization
我想将uuid/guid与模板专用化相关联。
以下代码可用于将 uuid 与非模板接口(类、结构)相关联:
__interface __declspec(uuid("CECA446F-2BE6-4AAC-A117-E395F27DF1F8")) ITest {
virtual void Test() = 0;
};
GUID guid = __uuidof(ITest); // OK
现在我有一个模板化界面
template<class T> __interface ITemplateTest {
virtual void Test(T t) = 0;
};
我想做以下工作:
GUID templateGuid = __uuidof(ITemplateTest<float>);
无法将 __declspec(uuid(...)) 添加到模板类定义中。这是显而易见的,因为接口的不同专用化需要不同的 uuid。因此,我尝试通过以下方式将uuid与模板专用化相关联:
template<> __interface __declspec(uuid("CF4AB938-8CE0-4AB7-A56C-0253B6018C26")) ITemplateTest<float>;
不幸的是,这也不起作用(__uuidof(.) 失败并显示"没有 GUID 与此对象关联")。
我的问题有什么解决方案吗?
以下是稍后在一些答案之后添加的更完整的示例:
假设我有一个适用于不同数据类型的复杂算法。为了简单起见,这种"复杂"算法正在对一个数字进行平方。我只想实现一次我的算法,所以模板是要走的路。让我们进一步假设我想使用接口,因为我的应用使用 COM。
因此,下面是一个接口和一个实现此接口的模板化对象:
template<class T> __interface ITemplateTest {
virtual T Square(T t) = 0;
};
template<class T> class CTemplateImplementation : public ITemplateTest<T> {
public:
virtual T Square(T t) { return t * t; };
};
这允许做类似的事情
CTemplateImplementation<double> xDouble;
CTemplateImplementation<float> xFloat;
CTemplateImplementation<int> xInt;
std::cout << xDouble.Square(5.) << std::endl
<< xFloat.Square(5.0f) << std::endl
<< xInt.Square(5) << std::endl;
现在让我们进一步假设我有另一个模板对象,也实现了一个非常"复杂"的算法,它利用了 CTemplateImplementation:
template<class T> class CSquareAndAddOne {
private:
CTemplateImplementation<T> m_squarer;
public:
T SquareAndAddOne(T t) { return m_squarer.Square(t) + T(1); }
};
现在可以以相同的方式使用此对象:
CSquareAndAddOne<double> yDouble;
CSquareAndAddOne<float> yFloat;
CSquareAndAddOne<int> yInt;
std::cout << yDouble.SquareAndAddOne(5.) << std::endl
<< yFloat.SquareAndAddOne(5.0f) << std::endl
<< yInt.SquareAndAddOne(5) << std::endl;
当 CSquareAndAddOne::SquandAndAddOne 想要利用 CTemplateImplementation 专业化的__uuid时,问题就出现了。请尝试以下操作:
T SquareAndAddOne(T t) {
GUID guid = __uuidof(m_multiplier);
return m_squarer.Square(t) + T(1);
}
这不再起作用,因为没有与m_multiplier同化的 GUID。那么,如何在不重复代码的情况下为 CTemplateImplementation 的不同实现(在本例中为三个)分配 guid?你能提供一个完整的解决方案吗?从 CTemplateImplementation 中为不同类型的派生不同的类是不可能的,因为在 CSquareAndAddOne 中使用正确类型的专用化不能再用模板参数来控制。
我尝试了一些明确的实例化魔法,它工作正常(至少在VS2008 SP1中):
template<class T> __interface ITemplateTest { void Test(T t); }; // Interface declaration
template __interface ITemplateTest<float>; // Explicit instantiation
template __interface __declspec(uuid("CF4AB938-8CE0-4AB7-A56C-0253B6018C26") ITemplateTest<float>; // Repeat explicit instantiation with uuid association
GUID guid = __uuidof(ITemplateTest<float>); // Enjoy! :-)
看起来最初的问题是__declspec
尝试在实际实例化之前将 guid 分配给类专用化。
尝试:
__interface __declspec(uuid("CF4AB938-8CE0-4AB7-A56C-0253B6018C26"))
ITestFloat: ITemplateTest<float> {
virtual void Test() = 0;
};
- .cpp和.h文件中的模板专用化声明
- 调用专用模板时出错"no matching function for call to [...]"
- 模板专用化(按容器):value_type
- 关联容器的下界复杂性:成员函数与非成员函数
- 静态数据成员模板专用化的实例化点在哪里
- std::future_error:无关联状态
- 特征 3 类的模板专用化
- Visual Studio 2017 不允许我创建 C++ 专用模板
- 字符串化递归的"std::vector<std::vector<...>>"而不使用部分模板函数专用化
- 具有常量引用参数的函数模板专用化
- 使用其他模板的模板专用化
- 使用专用显卡进行 OpenGL 渲染时帧速率较低
- 查找自动生成键并具有线性内存消耗的小型关联数组
- 嵌套模板显式专用化
- 如何检查模板专用化是否是基本模板的子类?
- C++:部分模板专用化用例
- 通过依赖类型使用非类型模板参数的单类型模板参数类模板的部分专用化
- 使用对象的基类部分模板专用化对对象进行哈希处理::哈希
- 如何在 OpenCV 中将图像与另一个图像相关联
- C++ Microsoft:如何将 uuid/guid 与模板专用化相关联