C ++类成员函数别名模板,防止大括号括起来的初始化程序列表被识别为对/元组

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C ++类成员函数别名模板,防止大括号括起来的初始化程序列表被识别为对/元组相关的知识,希望对你有一定的参考价值。

我正在研究用于竞争性编程的C ++模板,以缩短解决问题时需要输入的代码量。我希望简化的语法的一部分是特定STL类的成员函数名称,例如向量的.push_back(item)成员函数,类似于.pb(item)。我当前使用的代码如下:

// (I believe) this code allows me to dynamically generate all overloads without having to explicitly name the types
#define alias(type, from, to) template<typename... Ts> decltype(type<T...>().from(std::declval<Ts>()...)) to(Ts...s) {return this->from(s...);}

template <typename ...T>
struct _vector : public vector<T...> {
  alias(vector, push_back, pb);
};

到目前为止,此代码已用于基本功能,例如v.pb(1),其中v是整数的向量。但是,以下代码似乎无效:

int main() {
  _vector<pair<int, int>> v;
  v.pb({1, 2}); // this generates an error
  v.push_back({1, 2}); // this works fine
}

编译器抛出的错误消息是:

error: no matching function for call to '_vector<std::pair<int, int> >::pb(<brace-enclosed initializer list>)'

似乎别名阻止识别花括号包围的元素的对/元组语法,并自动将其强制转换为适当的对/元组类型。

有人能让我知道为什么会发生这种情况,如果可能的话,提出解决方案?谢谢!

答案

[{1, 2}没有类型,不能推论为Ts...(当前可能是initializer_list<T>)。

您可能会做:v.pb(pair{1, 2})(感谢C ++ 17中的CTAD)

一种简化方法是:

#define pb push_back

然后

std::vector <int> v;

v.pb (42); // Extra space

#define pb(...) push_back(__VA_ARGS__)

然后

std::vector <int> v;

v.pb(42);

以上是关于C ++类成员函数别名模板,防止大括号括起来的初始化程序列表被识别为对/元组的主要内容,如果未能解决你的问题,请参考以下文章

嵌套类的值初始化

静态变量,静态代码块

java 为啥数组这里要用大括号?

使用模板类数据成员的c ++“没有适当的默认构造函数可用”错误

c语言如何对结构体某一成员初始化

C++ 为类模板提供初始化列表构造函数