显然,我们可以在一个constexpr
函数中连接两个字符串文字,但是如何将一个字符串文字与另一个constexpr
函数返回的字符串连接起来呢,如下面的代码所示?
template <class T>
constexpr const char * get_arithmetic_size()
{
switch (sizeof(T))
{
case 1: return "1";
case 2: return "2";
case 4: return "4";
case 8: return "8";
case 16: return "16";
default: static_assert(dependent_false_v<T>);
}
}
template <class T>
constexpr std::enable_if_t<std::is_arithmetic_v<T>, const char *> make_type_name()
{
const char * prefix = std::is_signed_v<T> ? "int" : "uint";
return prefix; // how to concatenate prefix with get_arithmetic_size<T>() ?
}
static_assert(strings_equal(make_type_name<int>, make_type_name<int32_t>);
该代码使算术类型的与编译器无关的字符串标识符成为可能。
编辑1:
稍微复杂一点的示例是:
template<typename Test, template<typename...> class Ref>
struct is_specialization : std::false_type {};
template<template<typename...> class Ref, typename... Args>
struct is_specialization<Ref<Args...>, Ref> : std::true_type {};
template <class T>
constexpr std::enable_if_t<is_specialization<T, std::vector>::value || is_specialization<T, std::list>::value, const char *> make_type_name()
{
return "sequence"; // + make_type_name<typename T::value_type>;
}
static_assert(strings_equal(make_type_name<std::vector<int>>(), make_type_name<std::list<int>>()));
2
包含字节的std数组是否可以接受?否则,您可以使用宏和代码生成来执行此操作。
—
Yakk-Adam Nevraumont
@ Yakk-AdamNevraumont是的,似乎没有比
—
Dmitriano
std::array
(并且可能是可变参数模板)更好的解决方案
@ Yakk-AdamNevraumont连接std :: arrays:stackoverflow.com/questions/42749032/…,实时示例:wandbox.org/permlink/VA85KCTqxiyS2rKE
—
Dmitriano
看来您实质上是在尝试手动滚动以达到与
—
彼得
typeid
操作员相同类型的结果。部分原因typeid
是语言的一部分(例如,由专用的language关键字支持)而不是库函数,是因为其实现依赖于“编译器魔术”-如果没有实现的某些专用支持,则无法使用该语言来实现。
@Dmitriano是的,您可能会注意到我之前已经看过这个问题;)
—
Yakk-Adam Nevraumont