- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我想将 uuid/guid 与模板特化相关联。
以下代码可用于将 uuid 与非模板接口(interface)(类、结构)相关联:
__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(...)) 添加到模板类定义中。这是显而易见的,因为接口(interface)的不同特化需要不同的 uuid。所以我尝试通过以下方式将 uuid 与模板特化相关联:
template<> __interface __declspec(uuid("CF4AB938-8CE0-4AB7-A56C-0253B6018C26")) ITemplateTest<float>;
不幸的是,这也不起作用(__uuidof(.) 失败并显示“没有 GUID 与该对象相关联”)。
我的问题有什么解决方案吗?
这是在一些答案之后添加的更完整的示例:
假设我有一个适用于不同数据类型的复杂算法。为了简单起见,这种“复杂”的算法是对数字进行平方。我只想实现我的算法一次,所以模板是可行的方法。让我们进一步假设我想使用接口(interface),因为我的应用程序使用 COM。
所以这是一个接口(interface)和一个实现这个接口(interface)的模板化对象:
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::SquandAddOne 想要使用 CTemplateImplementation 特化的 __uuid 时,问题就出现了。尝试以下操作:
T SquareAndAddOne(T t) {
GUID guid = __uuidof(m_multiplier);
return m_squarer.Square(t) + T(1);
}
这不再有效,因为没有与 m_multiplier 关联的 GUID。那么如何在不复制代码的情况下将 guid 分配给 CTemplateImplementation 的不同实现(在本例中为三个)?你能提供一个完整的解决方案吗?不可能从 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 分配给它。
关于C++ 微软 : How to associate uuid/guid with template specialization,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11966892/
我正在尝试构建模板类 Fod template class Fod { ... }; 它将包含一个带有 static const int value 的内部类 At指示模板参数的索引(S0 为 0,S
我很难理解 Python in a Nutshell 的最后一部分(粗体) Per-Instance Methods An instance can have instance-specific bi
我需要密码字段的正则表达式。 要求是: 密码长度必须在8到20个字符之间 必须包含至少一个字母和一个数字以及来自!@#$%^&*() 的特殊字符_+。 不应以特殊字符开头 我试过了 ^(?=.*[a-
我有一个 C 类型的输入字段。 PARAMETERS lv_sep TYPE c. 字段 lv_sep 应该只接受特殊字符。 你能帮助我如何给出这个约束吗? 最佳答案 您可以在 AT-SELECTIO
我记得 PaulP 展示了一个很酷的技巧来缩写重复的长 @specialized序列,但我找不到原来的帖子了。就像我有 trait Foo[@specialized(Int, Float, Doubl
我有一个特征和一个实现,如下所示: trait Foo[A] { def bar[B >: A: Ordering]: Foo[B] } class FooImpl[A]( val a: A, v
在Sas9中,如何用下划线替换我选择的所有,\ /或空格以及其他特殊字符?无论是在数据步骤中还是在宏函数中的解决方案都可以解决问题,我只是在寻找一种实现方法。 谢谢 最佳答案 您可以使用SAS内置的P
SPECIALIZE 的目的pragma 是创建更具体的函数版本。 我有一个功能 adaptBlocks :: Int -> BlocksField a -> Maybe (BlocksField a
我尝试使用 gcc 10 -std=gnu++20 -fconcepts 构建以下内容: template class MyClass{ T a; }; template class MyClas
已关闭。这个问题是 off-topic 。目前不接受答案。 想要改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 已关闭11 年前。 Improve th
在哪里可以找到文件名中允许的字符列表(取决于操作系统)?(例如,在 Linux 上,文件名中允许使用字符 :,但在 Windows 上则不允许) 最佳答案 您应该从 Wikipedia Filenam
我有下面的powershell功能 Function Test { Param ( [Parameter()] [strin
我有下面的powershell功能 Function Test { Param ( [Parameter()] [strin
我有两个方阵 A 和 B。它们的每一项都有 1 或 0。示例如下所示 A channel id a b c 1 1 1 1 2 1 0 1 3 1 0 0 B id cha
是否可以将基础对象“特化”为派生对象? 例如: class base{... base(...) : ... {}//both have their own constructors virt
我有两个像这样连接在一起的圆圈: 我在形状内部有一个点,我想从该点沿一个方向将光线转换到形状上。为了检索形状边缘的类型转换位置。 我的第一个想法是将 2 段连接到 2 个圆圈进行光线转换。如果没有成功
在我的 Java 项目中,我有以下类/接口(interface)层次结构: public interface ProductSearcher { Set search(String reque
是否可以在不引入与实现完全匹配的签名的情况下定义这个专门的重载? on(eventName: string, cb: Function); on(eventName: "view", cb: (arg
偶然发现 def foo(f: Int => Unit) {} def foo(f: Long => Unit) {} 由于 method foo is defined twice 无法编译.我知道上
在下面的例子中,为什么 foo(f)叫暧昧? 我知道第二个重载也适用于 P == () , 但为什么第一个不被认为更专业, 因此更好的匹配? func foo(_ f: () -> R) { prin
我是一名优秀的程序员,十分优秀!