c++ 打印模板参数列表中类型的typeid

yrwegjxp  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(82)

我想定义一个函数,它打印模板参数列表中类型的typeid名称。该函数不接受值参数。例如,调用print<int>()应该打印intprint<int, double>()应该打印int, double,调用print<>()应该输出字符串no types
我有一个可行的解决方案,但它使用了一个额外的vector来完成这一点,由这个answer建议:

#include <iostream>
#include <vector>

template<class... T>
void print() {
    std::vector<const char*> ids{ typeid(T).name()... };

    if (ids.empty()) {
        std::cout << "no types\n";
        return;
    }

    const auto last = ids.size() - 1;

    for (size_t i = 0; i < last; i++)
        std::cout << ids[i] << ", ";

    std::cout << ids[last] << '\n';
}

int main() {
    print<>();
    print<int, double, char>();
    return 0;
}

字符串
正如你所看到的,这个函数在编译时不是很友好。我试图创建一个不涉及向量的代码版本,但是有一个不同的问题。

#include <iostream>

template<typename... Types>
void print() {
    ((std::cout << typeid(Types).name() << ", "), ...);
}

template<>
void print() {
    std::cout << "no types\n";
}

int main() {
    print<>();
    print<int, double, char>();
    return 0;
}

  • 输出 *
no types
int, double, char,


此版本在模板参数列表中的最后一个类型后打印一个逗号。我想去掉这个逗号。

zz2j4svz

zz2j4svz1#

要让逗号只出现在类型之前而不是之后,您可以打印第一个类型,然后打印所有其他类型,并在类型之前使用逗号

#include <iostream>

template<typename T, typename...Types>
void print_helper() {
    std::cout << typeid(T).name(); // first type
    ((std::cout << ", " << typeid(Types).name()), ...); // everything else
}

template<typename... Types>
void print() {
    print_helper<Types...>();
}

template<>
void print() {
    std::cout << "no types\n";
}

int main() {
    print<>();
    print<int, double, char>();
    return 0;
}

个字符
注意,只有msvc打印int,clang和gcc都使用i作为int,参见typeid
如果你想用循环的方法,那么你可以用一个std::array来代替向量,它不做堆分配in the assembly

#include <iostream>
#include <vector>
#include <array>
template<class... T>
void print() {
    std::array<const char*, sizeof...(T)> ids{ typeid(T).name()... };

    if (ids.empty()) {
        std::cout << "no types\n";
        return;
    }

    const auto last = ids.size() - 1;

    for (size_t i = 0; i < last; i++)
        std::cout << ids[i] << ", ";

    std::cout << ids[last] << '\n';
}

int main() {
    print<>();
    print<int, double, char>();
    return 0;
}

相关问题