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.