忽略模板参数以提供交换功能

Posted

技术标签:

【中文标题】忽略模板参数以提供交换功能【英文标题】:Ignore template argument to provide swap function 【发布时间】:2018-01-28 16:54:23 【问题描述】:

我想为我的模板类提供一个交换功能。这是一个简化版:

template <int size, typename...DataTypes>
class ExampleClass

public:
   ExampleClass() : data(size) 
   void swap(ExampleClass& _Right)
   
      data.swap(_Right);
   


protected:
   std::vector<std::tuple<Types...>> data;

在这种情况下交换功能不起作用:

ExampleClass<1,int,float> ec1;
ExampleClass<2,int,float> ec2;
ec1.swap(ec2);

如果我在不使用此类的情况下交换这些元组向量,它可以工作:

std::vector<std::tuple<int, float> data1(2);
std::vector<std::tuple<int, float> data2(3);
data1.swap(data2);

是否可以使用我首先描述的模板类提供交换功能?

【问题讨论】:

与你的问题无关,但我建议你阅读What are the rules about using an underscore in a C++ identifier?然后你就会知道为什么_Right不是一个好名字。 【参考方案1】:

swap 函数设为模板:

template<int size2, typename...DataTypes2>
void swap(ExampleClass<size2, DataTypes2...>& _right)  ... 

当然,将正确的参数传递给data.swap()(你不知道)。

【讨论】:

您能详细解释一下吗?我无法实现它,对不起......编辑:对不起,只是一个小错误。现在可以使用了,谢谢! 你知道使用 std::swap 并交换整个类而不是成员变量的类似方法吗? @User19123 在与类相同的命名空间中创建一个非成员swap 函数,在其中一个参数上调用成员swap 函数?你也可以specializestd::swap函数。

以上是关于忽略模板参数以提供交换功能的主要内容,如果未能解决你的问题,请参考以下文章

如何根据 IAM 角色 CloudFormation 模板中的参数提供不同的条件

复习笔记——C++模板

C++模板(函数模板/类模板)

C++模板(函数模板/类模板)

C++模板初阶

C++ 模板参数推导/替换失败: