std::get 自己 class 以元组为成员
std::get for own class with tuple as member
我有一个 class 这样的:
template<typename ... TTypes>
class Composite {
public:
std::tuple<TTypes...> &getRefValues() { return values; }
private:
std::tuple<TTypes...> values;
};
我可以为我的 class 组合定义 std::get
吗?它基本上应该为私有元组值调用已经定义的 std::get
。
当 return 类型已知时(例如,对于 int 数组成员),我能够实现自定义的 get 函数,但我不知道如何在 return 类型时实现 get可以是任意类型(取决于元组值的组件类型)?
你可以这样做:
template <std::size_t I, typename... Ts>
auto get(Composite<Ts...>& composite)
-> decltype(std::get<I>(composite.getRefValues()))
{
return std::get<I>(composite.getRefValues());
}
注意:在 C++14 中,您可以省略 -> decltype(..)
部分。
为了完整起见,这是我的解决方案。谢谢大家:
template<typename ... TTypes>
class Composite {
public:
Composite(TTypes... t) {
std::tuple<TTypes...> tuple(t...);
values = tuple;
}
std::tuple<TTypes...> &getRefValues() { return values; }
private:
std::tuple<TTypes...> values;
};
namespace std {
template<size_t I, typename ... TTypes>
auto get(Composite<TTypes ...> &t) -> typename std::tuple_element<I, std::tuple<TTypes...>>::type {
return std::get<I>(t.getRefValues());
}
}
int main() {
Composite<int, char, double> c(13, 'c', 13.5);
std::cout << std::get<0>(c) << std::endl;
std::cout << std::get<1>(c) << std::endl;
std::cout << std::get<2>(c) << std::endl;
return 0;
}
我有一个 class 这样的:
template<typename ... TTypes>
class Composite {
public:
std::tuple<TTypes...> &getRefValues() { return values; }
private:
std::tuple<TTypes...> values;
};
我可以为我的 class 组合定义 std::get
吗?它基本上应该为私有元组值调用已经定义的 std::get
。
当 return 类型已知时(例如,对于 int 数组成员),我能够实现自定义的 get 函数,但我不知道如何在 return 类型时实现 get可以是任意类型(取决于元组值的组件类型)?
你可以这样做:
template <std::size_t I, typename... Ts>
auto get(Composite<Ts...>& composite)
-> decltype(std::get<I>(composite.getRefValues()))
{
return std::get<I>(composite.getRefValues());
}
注意:在 C++14 中,您可以省略 -> decltype(..)
部分。
为了完整起见,这是我的解决方案。谢谢大家:
template<typename ... TTypes>
class Composite {
public:
Composite(TTypes... t) {
std::tuple<TTypes...> tuple(t...);
values = tuple;
}
std::tuple<TTypes...> &getRefValues() { return values; }
private:
std::tuple<TTypes...> values;
};
namespace std {
template<size_t I, typename ... TTypes>
auto get(Composite<TTypes ...> &t) -> typename std::tuple_element<I, std::tuple<TTypes...>>::type {
return std::get<I>(t.getRefValues());
}
}
int main() {
Composite<int, char, double> c(13, 'c', 13.5);
std::cout << std::get<0>(c) << std::endl;
std::cout << std::get<1>(c) << std::endl;
std::cout << std::get<2>(c) << std::endl;
return 0;
}