gpt4 book ai didi

c++ - 如何为模板特化设置别名?

转载 作者:行者123 更新时间:2023-11-28 06:30:25 26 4
gpt4 key购买 nike

我有一个类型 T,它有一个返回类型为 RT 的成员函数 fn。我有一个将 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,但我遇到了一些困难,我也希望它看起来更简洁。

最佳答案

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

关于c++ - 如何为模板特化设置别名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27692855/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com