changeset 2:20c6c0bec02a

Add replace_type
author Lewin Bormann <lbo@spheniscida.de>
date Tue, 24 Mar 2020 19:50:07 +0100
parents 3707ed11b401
children 58777a883f54
files CMakeLists.txt src/replace_type.cc
diffstat 2 files changed, 42 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/CMakeLists.txt	Mon Mar 23 18:31:24 2020 +0100
+++ b/CMakeLists.txt	Tue Mar 24 19:50:07 2020 +0100
@@ -1,8 +1,9 @@
 project("CTMP")
 cmake_minimum_required(VERSION 3.16)
-
 add_compile_options(-std=c++17)
 
 add_executable(example src/example.cc)
 
 add_executable(binary src/binary.cc)
+
+add_executable(replace_type src/replace_type.cc)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/replace_type.cc	Tue Mar 24 19:50:07 2020 +0100
@@ -0,0 +1,40 @@
+#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;
+}