view src/replace_type.cc @ 2:20c6c0bec02a

Add replace_type
author Lewin Bormann <lbo@spheniscida.de>
date Tue, 24 Mar 2020 19:50:07 +0100
parents
children 58777a883f54
line wrap: on
line source

#include <iostream>

class C {};

template<typename C, typename X, typename Y>
struct replace_type {
    typedef C type;
};

template<typename X, typename Y>
struct replace_type<X*, X, Y> {
    typedef Y* type;
};

template<typename X, typename Y>
struct replace_type<X&, X, Y> {
    typedef Y& type;
};

template<typename R, typename X, typename Y>
struct replace_type<R (*)(X), X, Y> {
    typedef R (*type)(Y);
};

template<typename X, typename Y>
struct replace_type<X (*)(X), X, Y> {
    typedef Y (*type)(Y);
};

template<typename A, typename X, typename Y>
struct replace_type<X (*)(A), X, Y> {
    typedef Y (*type)(A);
};

int main(void) {
    typedef char& (*typ)(char& a);
    std::cout << typeid(typ).name() << std::endl;
    std::cout << typeid(replace_type<typ, unsigned, unsigned>::type).name() << std::endl;
    return 0;
}