我如何为模板专业化设置别名?

时间:2014-12-29 16:55:39

标签: c++ templates c++11 decltype

我有一个类型T,其成员函数fn的返回类型为RT。 我有一个以TRT为参数的模板。我想为这个模板类添加别名,以便我的代码不那么丑陋且难以阅读。我将如何实现这一目标?

template <typename X, typename Y>
struct I
{};

struct T
{
  int& fn(int);
};

所以我想对这个或类似的东西进行别名,所以我可以写一个这样的函数:

template <typename C>
I< typename std::remove_reference<std::decltype(std::declval(C).fn(0))>::type, C> fn(C& c)
{
  return I< typename std::remove_reference<std::decltype(std::declval(C).fn(0))>::type, C>();
}

但是少了一团糟。我之前没有使用std::decltype,所以我甚至不确定我是否正确使用它,因为我遇到了错误。

我正在考虑使用这样的函数并在其上做一个decltype,但我遇到了一些困难,我希望它看起来更干净。

1 个答案:

答案 0 :(得分:1)

decltype()是一个内置的运算符,而不是std命名空间中的函数,如std::declval<T>()

如果您想使用别名模板缩短语法,可以声明如下所示:

#include <type_traits>    

template <typename C>
using IT = I<C, typename std::remove_reference<decltype(std::declval<C&>().fn(0))>::type>;

template <typename C>
IT<C> fn(C& c)
{
  return IT<C>(&c, c.fn(1));
}

DEMO


由于上述代码由于未知原因无法在VC ++中成功编译,因此您可以创建一个别名模板来查询您已有的辅助函数的结果类型:

template <typename C>
I<C, typename std::remove_reference<decltype(std::declval<C&>().fn(0))>::type> test();

template <typename C>
using IT = decltype(test<C>());

template <typename C>
IT<C> fn(C& c)
{
  return IT<C>(&c, c.fn(1));
}

DEMO 2