[英]Confusion while deriving from std::tuple, can not handle std::get
[英]Can I get “cons list” behaviour from a std::tuple?
我想遞歸定義一個函數,該函數設置std :: tuple的所有元素。 如果這是一個boost :: tuple,我只需看一下這里並復制以下示例:
inline void set_to_zero(const null_type&) {};
template <class H, class T>
inline void set_to_zero(cons<H, T>& x) { x.get_head() = 0; set_to_zero(x.get_tail()); }
到目前為止,我找不到std :: tuple這么簡單的東西。 有什么要關閉的嗎?
更新:好的,我需要多補充一點問題。
template<typename T>
struct simple_setter
{
void set(T &target); // somebody else's stuff, defined elsewhere
};
template<typename Tuple> class foo;
template<>
struct foo<boost::tuple<>>
{
foo() {}
void set(boost::tuple<> &target) {}
};
template<typename E, typename... Es>
struct foo<boost::tuple<E, Es...>>
{
explicit foo(const simple_setter<E> &head_setter, const simple_setter<Es> & ... other_setters) :
_head(head_setter),
_tail(other_setters)
{}
void set(boost::tuple<E, Es...> &target) {
_head.set(target.get_head()),
_tail.set(target.get_tail())
}
// more methods to do other things
const simple_setter<E> &_head;
const foo<boost::tuple<Es ...>> _tail;
};
我正在寫包裝元組的foo類,以便執行一堆事情,其中之一就是設置所有元素。 我希望保留foo的這種遞歸定義,但希望從boost :: tuples切換到std :: tuples。
遞歸可以通過這種方式實現
template < typename _Tuple >
inline void set_to_zero(_Tuple& tuple, std::integral_constant<size_t, 0>)
{
}
template < typename _Tuple, size_t N >
inline void set_to_zero(_Tuple& tuple, std::integral_constant<size_t, N>)
{
set_to_zero(tuple, std::integral_constant<size_t, N - 1>());
// action(std::get<N - 1>(tuple));
}
template < typename _Tuple >
inline void set_to_zero(_Tuple& tuple)
{
set_to_zero(tuple, std::integral_constant<size_t, std::tuple_size<_Tuple>::value>());
}
或更一般的形式
template < typename _Tuple, typename _Func >
inline void for_each(_Tuple& tuple, _Func func_, std::integral_constant<size_t, 0>)
{
}
template < typename _Tuple, typename _Func, size_t N >
inline void for_each(_Tuple& tuple, _Func func_, std::integral_constant<size_t, N>)
{
for_each(tuple, func_, std::integral_constant<size_t, N - 1>());
func_(std::get<N - 1>(tuple));
}
template < typename _Tuple, typename _Functor >
inline void for_each(_Tuple& tuple, _Functor func_)
{
for_each(tuple, func_, std::integral_constant<size_t, std::tuple_size<_Tuple>::value>());
}
廣義形式的用法樣本
struct DoSomething
{
void operator()(int a) {} // overload for int
void operator()(double a) {} // overload for double
};
std::tuple<int, double> tuple_;
for_each(tuple_, DoSomething());
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.