我有一个类型T
,其成员函数fn
的返回类型为RT
。
我有一个以T
和RT
为参数的模板。我想为这个模板类添加别名,以便我的代码不那么丑陋且难以阅读。我将如何实现这一目标?
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,但我遇到了一些困难,我希望它看起来更干净。
答案 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));
}
由于上述代码由于未知原因无法在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));
}