Mercurial > lbo > hg > ctmp
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; +}