C++ to D - recursion with std.variant

Dennis Ritchie via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Fri Apr 3 09:46:06 PDT 2015


Hi,
Is it possible to write on D recursion using std.variant?

-----
#include <boost/variant.hpp>
#include <iostream>

struct Nil {};
auto nil = Nil{};

template <typename T>
struct Cons;

template <typename T>
using List = boost::variant<Nil,
boost::recursive_wrapper<Cons<T>>>;

template <typename T>
struct Cons {
	Cons(T val, List<T> list) : head(val), tail(list) {}

	T head;
	List<T> tail;
};

template <typename T>
class length_visitor : public boost::static_visitor<size_t> {
public:
	int operator()(Nil) const {
		return 0;
	}

	int operator()(const Cons<T>& c) const {
		return 1 + length(c.tail);
	}
};

template <typename T>
auto cons(T head, List<T> tail) {
	return List<T>(Cons<T>(head, tail));
}

template <typename T>
auto cons(T head, Nil) {
	return List<T>(Cons<T>(head, List<T>(Nil{})));
}

template <typename T>
size_t length(const List<T>& list) {
	return boost::apply_visitor(length_visitor<T>(), list);
}

int main() {

	auto l = cons(3, cons(2, cons(1, nil)));
	std::cout << length(l) << std::endl; // prints 3

	return 0;
}
-----
http://ideone.com/qBuOvJ


More information about the Digitalmars-d-learn mailing list