在为我正在处理的某个项目实现一个compressed_tuple
类时,我遇到了以下问题:我似乎无法将这种类型的实例传递给 std::apply,尽管这应该可以根据:https:// en.cppreference.com/w/cpp/utility/apply。
我使用以下片段( godbolt )很容易地重现了这个问题:
#include <tuple>
struct Foo {
public:
explicit Foo(int a) : a{ a } {}
auto &get_a() const { return a; }
auto &get_a() { return a; }
private:
int a;
};
namespace std {
template<>
struct tuple_size<Foo> {
constexpr static auto value = 1;
};
template<>
struct tuple_element<0, Foo> {
using type = int;
};
template<size_t I>
constexpr auto get(Foo &t) -> int & {
return t.get_a();
}
template<size_t I>
constexpr auto get(const Foo &t) -> const int & {
return t.get_a();
}
template<size_t I>
constexpr auto get(Foo &&t) -> int && {
return std::move(t.get_a());
}
template<size_t I>
constexpr auto get(const Foo &&t) -> const int && {
return move(t.get_a());
}
} // namespace std
auto foo = Foo{ 1 };
auto f = [](int) { return 2; };
auto result = std::apply(f, foo);
当我尝试编译这段代码时,它似乎找不到std::get
我定义的重载,即使它们应该完全匹配。相反,它尝试匹配所有其他重载(std::get(pair<T, U>)、std::get(array<...>) 等),甚至没有提及我的重载。我在所有三个主要编译器(MSVC、Clang、GCC)中都遇到了一致的错误。
所以我的问题是这是否是预期的行为,并且根本不可能std::apply
与用户定义的类型一起使用?有解决方法吗?