在我设法为我的类类型重载std::swap
之后,我现在想要专门化它,而不是重载它,因为标准允许向名称空间std
添加模板专门化。下面是我的例子:
class Foo{
public:
Foo(){
std::cout << "Foo()\n";
}
Foo(Foo const&){
std::cout << "Foo(Foo const&)\n";
}
Foo(Foo&&){
std::cout << "Foo(Foo&&)\n";
}
Foo& operator=(Foo const&){
std::cout << "operator=(Foo const&)\n";
return *this;
}
Foo& operator=(Foo&&){
std::cout << "operator=(Foo&&)\n";
return *this;
}
~Foo(){
std::cout << "~Foo()\n";
}
};
class VecFoo;
namespace std{
template <>
void swap<VecFoo>(VecFoo&, VecFoo&);
}
class VecFoo{
Foo* pFoo_ = new Foo[10];
template<>
friend void std::swap<VecFoo>(VecFoo&, VecFoo&);
};
template <>
void std::swap<VecFo>(VecFoo& lhs, VecFoo& rhs){
std::cout << "template <> void std::swap(VecFoo&, VecFoo&)\n";
std::swap(lhs.pFoo_, rhs.pFoo_);
}
int main(){
VecFoo vf1, vf2;
using std::swap;
swap(vf1, vf2);
}
/usr/include/C++/10/type_traits2195需要替换“template
使用_require=std::__enable_if_t
>::value>”[with_cond={std::__not_
>,std::is_move_constructable
,std::is_move_assignable
那么这里的问题是什么,我怎样才能正确地对它进行专门化呢?
- 附注:请不要争论我在
vecfoo
课上没有达到的RAII和那里的内存泄漏,因为这不是我的问题。
这真的很简单。您不需要模板,但确实需要在正确的名称空间中。
namespace std {
void swap(VecFoo& lhs, VecFoo& rhs) {
std::cout << "void swap(VecFoo&, VecFoo&)\n";
//do your custom swap here!!!
}
}
我有这样的代码: 这段代码的目的是:如果是或的子类,则将推导为,否则推导为
我已经实现了这个示例: > 如果我运行程序,程序编译和工作都很好。正如您所看到的,我的函数与调用运算符中的功能相同,它是专门化的成员函数,那么为什么我专门化后一个而可以提供简单的hasher函数呢? 那是为了灵活性吗?例如,为我的类型提供函数而不是专门化类型,需要在关联容器实例化中指定为模板参数和函数参数,比如,而后者不需要?
<代码> 现在,我听到了关于专门化和的矛盾信息-有人告诉我,向std命名空间添加任何东西都会导致未定义的行为,而我也被告知,您可以提供自己的和的专门化。 这就是我现在正在做的: 这确实有效:http://ideone.com/wHVfkh 但我想知道,这样做有什么坏处?有更好的方法吗?
我有一个通用算法,需要访问其模板类型的特征。有一个特征类可以专门用于提供这些特征。 在我的类中使用此算法时,我想将其与类中定义的私有类型一起使用。 然而,专门化只能发生在或全局范围内,而我的类是不可访问的。 是否有可能以某种方式专门化具有私有类型的模板,至少在可访问此类型的范围内? 也许可以将这个专门化声明为一个类?
我有一些代码使用两种不同类型的颜色,每个通道8位和每个通道16位,每个都由一个结构表示。为了有效地重用我的代码,我有一个模板函数可以对它们进行一些渲染。因此,我希望有一个模板函数来获取我的颜色通道的最大值。 我最初的尝试是这样的。我只展示了8 bpc的专业化 这不会在Visual studio 2012中编译。我明白了 1个 对我来说,我觉得这应该行得通,但我一直找不到任何例子。在Speciali
这非常适合 然后我试着看看我是否可以用CRTP基来专门化 这不起作用,我得到“静态断言失败:不知道如何格式化类型”,两个类型之间没有有效的转换,我想这是因为显式模板转换问题。我试着 我得到了一个关于“模板参数在部分专门化中不可推导”的错误:好吧,所以接下来我尝试 似乎完全跳过类型,我得到我得到“静态断言失败:不知道如何格式化类型”。所以我试着 我得到了“错误:模板参数在部分专门化中不可推导”,然后