我经常想得到一个类模板参数的decltype以便进一步使用它,比如在我已经剥离并简化以显示我的问题的循环中:
template <typename T>
class Foo {
public:
T type; //This is my hack to get decltype of T
};
template <typename T>
class Bar {
public:
};
int main() {
for(auto& foo : fs) {
//Is there some way to get the decltype of the template without having to refer to some arbitrary T member of Foo?
auto bar = someFunction<decltype(foo.type)>();
}
}
有没有办法在不进行此操作的情况下获取模板参数的decltype?如果没有,获得这样一个值的decltype的最佳解决方法是什么?
答案 0 :(得分:7)
您可以创建一个type_traits:
template <typename C>
struct get_template_type;
template <template <typename > class C, typename T>
struct get_template_type<C<T>>
{
using type = T;
};
然后你使用它(假设为C = Foo<T>
,你将拥有T
)
typename get_template_type<C>::type
编辑:对于具有多个模板参数的类,要检索第一个:
template <template <typename > class C, typename T, typename ... Ts>
struct get_template_type<C<T, Ts...>>
{
using type = T;
};
答案 1 :(得分:1)
标准库中的所有东西都有类本地typedef:
template<typename T>
struct Bla
{ using value_type = T; }
所以你可以这样做:
template<typename T>
void f(const T& t)
{
typename T::value_type some_var_with_template_type;
}
或者,您可以修改调用函数:
template<template<typename> class Class, typename T>
void f(const Class<T>& c)
{
T some_var_with_template_type;
}
但这会对可用性和普遍性施加限制。例如,如果存在具有多个模板参数的Class
,则会失败(尽管可以使用可变参数模板来解决此问题)。 Variadic模板版本:
template<template<typename, typename...> class Class, typename T, typename... ArgTypes>
void f(const Class<T, ArgTypes...>& t)
{
T some_var_of_template_type;
}
请注意value_type
typedef是迄今为止最干净,最惯用的解决方案。
Some code to show how the functions would need to be written and used.