如何获取模板class模板参数?
How to get template class template parameter?
我有一个模板class,想知道当模板class用作函数的模板参数时如何获取变量类型。
我尝试执行以下操作
#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;
}
此代码无法编译,因为 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;
}
现在它工作正常,但我不得不重命名模板参数。我可以在不使用 using
重命名的情况下获取模板参数值吗?
您可以创建特征以在不更改原始类型的情况下提取该信息。
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";
}
我有一个模板class,想知道当模板class用作函数的模板参数时如何获取变量类型。 我尝试执行以下操作
#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;
}
此代码无法编译,因为 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;
}
现在它工作正常,但我不得不重命名模板参数。我可以在不使用 using
重命名的情况下获取模板参数值吗?
您可以创建特征以在不更改原始类型的情况下提取该信息。
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";
}