gpt4 book ai didi

c++ - 如何使用 std::enable_if_t 进行完美转发?

转载 作者:行者123 更新时间:2023-12-02 05:41:43 25 4
gpt4 key购买 nike

我编写了一个接收可变数量的 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

最佳答案

当您传递左值时,pairs 将在其类型中保留引用,因此

std::is_same_v<std::pair<int, int>, pairs>

结果为假。

您必须丢弃引用,例如使用 std::decay_t:

std::enable_if_t<((std::is_same_v<std::pair<int, int>, std::decay_t<pairs> >) && ...)>* = nullptr

关于c++ - 如何使用 std::enable_if_t 进行完美转发?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60363570/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com