【发布时间】:2020-06-07 08:30:15
【问题描述】:
我写了一个函数,它接收一个可变数的 std::pairs,它从每对的第一个元素中减去第二个元素,并从新生成的结果中返回一个元组,如下所示:
template<typename... pairs, std::enable_if_t<((std::is_same_v<std::pair<int, int>, pairs>) && ...)>* = nullptr>
inline constexpr auto foo(pairs&& ...p) noexcept {
return std::tuple((std::get<1>(std::forward<pairs>(p)) - std::get<0>(std::forward<pairs>(p))) ...);
}
int main() {
constexpr auto bar = foo(std::pair(4, 6), std::pair(3, 7), std::pair(1, 2));
return 0;
}
这工作得很好。除非我尝试向它传递一个不是右值的 std::pair,像这样:
int main() {
constexpr auto tup = std::pair(4, 6);
constexpr auto bar = foo(tup, std::pair(3, 7), std::pair(1, 2));
return 0;
}
如果我尝试这样做,我会收到以下错误:
no matching function for call to 'foo(const std::pair<int, int>&, std::pair<int, int>, std::pair<int, int>)'
如何将 std::pairs 作为左值和右值引用传递给该函数?我正在使用 C++17
【问题讨论】:
-
我不确定,但问题可能出在
std::same_v<std::pair<int,int>, pair>- 如果它是std::pair<int,int>&怎么办?此外,这不是编写此类代码的好方法。最好让它成为一个接受std::initializer_list<std::pair<int,int>>而不是模板混乱的非模板函数。
标签: c++ algorithm templates c++17 metaprogramming