简体   繁体   中英

Retrieve a type from a string known at compile time

Is it possible to get a type according to a string known at compile time? Mainly with constexpr std::string_view .

#include <bits/stdc++.h>

template <std::string_view> 
struct MakeType {};

template <> 
struct MakeType<"int"> {
    using type = int;
};

template <> 
struct MakeType<"float"> {
    using type = float;
};


int  main() {
  constexpr std::string_view my_int = "int";
  MakeType<my_int>::type i = 5;

  return 0;
}

Yes, you can do such things, even if I currently did not see why we need it. But it did not work on base of std::string_view as we need a data type which contains the data in the object itself. As C++20 offers a simple way to define a constexpr string type via template parms, we have all what we need!

template<size_t N>
struct mystring
{
    std::array<char, N> arr_;

    constexpr mystring(const char(&in)[N]) : arr_{}
    {   
        std::copy(in, in + N, arr_.begin());
    }   
};


template < mystring s > struct MakeType { using type=void;};
template <> struct MakeType<"int"> {using type=int;};
template <> struct MakeType<"double"> {using type=double;};

template < mystring T>
using MakeType_t = MakeType<T>::type;

int main()
{
    MakeType_t<"int"> xi=9;
    MakeType_t<"double"> xd=10.234;

    std::cout << xi << std::endl;
    std::cout << xd << std::endl;

    static_assert( std::is_same_v< double, MakeType_t<"double">>);
    static_assert( std::is_same_v< int, MakeType_t<"int">>);
}

See it working here on gcc... also for clang

Remark: clang requires an additional typename . I believe clang is wrong here, as in C++20 the need of additional typename was relaxed a lot, but I am not a language-lawyer.

No not possible with c++. I don't see why it would ever be necessary. If you hardcode the string "int" you can hardcode int as the type specifier.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM