C++ to D

Dennis Ritchie via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Wed Apr 1 10:03:32 PDT 2015


On Wednesday, 1 April 2015 at 15:22:10 UTC, John Colvin wrote:
> Compile Time Function Evaluation (CTFE) is a very powerful tool
> to avoid having to enter in to all that C++ style mess.

Yes, CTFE in D really cool. Thanks.

I need to implement arithmetic (addition / subtraction) only use 
the type system.
That is, such a design does not suit me:

enum Add(Args...) = Args[0] + Args[1];
enum Inc(Args...) = Args[0] + 1;

I need a code like this:

-----
#include <iostream>

struct zero;

template <typename T>
struct succ {
};

template <typename T>
struct increment {
	using result = succ<T>;
};

template <typename T>
struct decrement;

template <typename T>
struct decrement<succ<T>> {
	using result = T;
};

template <typename A, typename B>
struct addition;

template <typename A>
struct addition<A, zero> {
	using result = A;
};

template <typename A, typename T>
struct addition<A, succ<T>> {
	using result = typename addition<succ<A>, T>::result;
};

template <typename T>
struct to_int;

template <>
struct to_int<zero> {
	static constexpr auto result = 0;
};

template <typename T>
struct to_int<succ<T>> {
	static constexpr auto result = 1 + to_int<T>::result;
};

template <typename T>
using inc = typename increment<T>::result;

template <typename T>
using dec = typename decrement<T>::result;

template <typename A, typename B>
using add = typename addition<A, B>::result;

int main() {

	using one = inc<zero>;
	using two = inc<inc<zero>>;
	using four = inc<inc<inc<inc<zero>>>>;
	using two_plus_one = add<two, one>;

	std::cout << to_int<four>::result << std::endl; // 4
	std::cout << to_int<two_plus_one>::result << std::endl; // 3

	return 0;
}


More information about the Digitalmars-d-learn mailing list