当前位置: 首页 > 知识库问答 >
问题:

如何为我的类型适当地专门化std::swap?

白青青
2023-03-14

在我设法为我的类类型重载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和那里的内存泄漏,因为这不是我的问题。

共有1个答案

燕永昌
2023-03-14

这真的很简单。您不需要模板,但确实需要在正确的名称空间中。

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基来专门化 这不起作用,我得到“静态断言失败:不知道如何格式化类型”,两个类型之间没有有效的转换,我想这是因为显式模板转换问题。我试着 我得到了一个关于“模板参数在部分专门化中不可推导”的错误:好吧,所以接下来我尝试 似乎完全跳过类型,我得到我得到“静态断言失败:不知道如何格式化类型”。所以我试着 我得到了“错误:模板参数在部分专门化中不可推导”,然后