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