如何获取模板类模板参数?

mou*_*_00 4 c++ templates

我有一个模板类,想知道当模板类变量用作函数的模板参数时如何获取模板类变量类型。我尝试执行以下操作

#include <iostream>
#include <type_traits>

using namespace std;

template <typename T>
class foo
{
};

template <typename templateClass>
void f()
{
    if (is_same<typename templateClass::T, int>::value)
        cout << "int";
    else if (is_same<typename templateClass::T, double>::value)
        cout << "double";
    else
        cout << "Unknown type";
}

int main()
{
    f<foo<double>>();

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

该代码无法编译,因为no type named 'T' in 'foo<double>'. 然后我稍微改变了一下:

#include <iostream>
#include <type_traits>

using namespace std;

template <typename T>
class foo
{
public:
    using Type = T; //can't write : using T = T;
};

template <typename templateClass>
void f()
{
    if (is_same<typename templateClass::Type, int>::value)
        cout << "int";
    else if (is_same<typename templateClass::Type, double>::value)
        cout << "double";
    else
        cout << "Unknown type";
}

int main()
{
    f<foo<double>>();

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

现在它工作正常,但我必须重命名模板参数。我可以在不使用 重命名的情况下获取模板参数值吗using

Jar*_*d42 5

您可以创建特征来提取该信息,而无需更改原始类型。

template <typename T>
struct template_parameter;

template <template <typename ...> class C, typename T>
struct template_parameter<C<T>>
{
    using type = T;
};

template <typename T>
using template_parameter_t = typename template_parameter<T>::type;
Run Code Online (Sandbox Code Playgroud)

进而

template <typename templateClass>
void f()
{
    if constexpr (std::is_same_v<template_parameter_t<templateClass>, int>)
        std::cout << "int";
    else if constexpr (std::is_same_v<template_parameter_t<templateClass>, double>)
        std::cout << "double";
    else
        std::cout << "Unknown type";
}
Run Code Online (Sandbox Code Playgroud)

演示