获取模板参数的decltype

时间:2014-12-09 15:18:24

标签: c++ templates decltype

我经常想得到一个类模板参数的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的最佳解决方法是什么?

2 个答案:

答案 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

Live example

编辑:对于具有多个模板参数的类,要检索第一个:

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.