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

4

我有一个模板类,并想知道当它作为函数的模板参数时,如何获取模板类变量类型。 我尝试做以下操作:

#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;
}

这段代码无法编译,因为在 foo<double> 中没有名为“T”的类型。 然后我稍微改了一下:

#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;
}

现在程序可以正常工作,但我不得不重命名模板参数。我能否在不使用 using 重命名模板参数的情况下获取模板参数的值?


你不是在重命名 T,而是在重命名 double - littleadv
f<std::string>() 怎么样?也就是说,这不是由 foo 生成的拼写错误?您想要解决的实际问题是什么? - Ulrich Eckhardt
“我能否在不使用using重命名的情况下获取模板参数值?”简单的答案是不行。 - 康桓瑋
1个回答

4

你可以创建特征(traits)来提取信息,而无需改变原始类型。

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;

然后

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";
}

演示


嗨,@Jarod42,我不知道如何调用/使用你的代码。你介意分享完整的代码吗? - jian
@Mark:修正了拼写错误(_v::value)并添加了演示。 - Jarod42

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接