假设我是某个模板库(CTL
)的用户,该模板定义了一个模板,名为Hector
template <class T>
class Hector {...};
在其文档中,它提供了许多关于Hector
模板行为的保证。
但是它还定义了某种类型Cool
template <>
class Hector<Cool> {....};
专业化的目的是更优化Hector
的实施,但遗憾的是,由于此优化,违反了Hector
的许多保证。
目前我真的不需要优化,我宁愿保留Hector
的所有保证。有没有办法,如果不改变库代码(CTL
是一个非常受尊敬的库,你知道),绕过专业化?有什么办法吗?也许写一些包装?什么?我只是希望编译器以正常的,非优化的方式为Hector<Cool>
生成代码,并提供所有保证。
答案 0 :(得分:12)
您可以在虚拟类型中包裹cool,以防止模板专门化。
答案 1 :(得分:12)
您是否可以使用没有不受欢迎的专业化的相关模板Reque
?否则我认为您需要为Cool
创建一个包装器,以便不使用特化。
答案 2 :(得分:8)
没有。即使它可以以某种深奥的方式完成,也不要。规避语言功能应引发警报。
您必须包装该值或使用其他类型,例如char
而不是bool
(它们的行为相似),而不是std::vector<char>
,而是std::vector<bool>
。
答案 3 :(得分:7)
这是一个小小的通用伪装:
template <typename T>
struct Drool
{
Drool(T d) : b(d) { }
inline operator T() const { return b; }
inline Drool<T> & operator=(T d) { b = d; return *this; }
private:
T b;
};
现在你可以说Hector<Drool<Cool>>
。
根据Xeo改进版本:
template <typename T>
struct Drool
{
Drool(const T & d) : b(d) { }
Drool(Drool && o) = default;
inline operator const T & () const { return b; }
inline operator T & () { return b; }
private:
T b;
};
答案 4 :(得分:0)
"my_hector.h"
#include <hector>
搜索并替换#include "my_hector.h"
[编辑@Xeo ;-)]