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