C++ 提案函数返回类型

C++ Proposal Function Returning A Type

因为有很多建议,所以我想问一下 C++ 中是否存在这样的东西,或者是否有任何建议可以做这样的事情。

想法:

template <typename T>
constexpr typename evalToType(int x, int y) {
    if(x > y)
        return T;
    else
        return int;
}

template <typename T, int x, int y>
evalToType<T>(x, y) SomeFunction() {
    return 0;
}

这样做的动机很简单,基本上是模板可以非常复杂并且变得非常不可读,所以为什么不将模板 SFINAE 内容表达成一个 constexpr,它基本上 returns 是一种类型而不是值。

这已经成为可能,但语法不同。因此,引入另一种语法并没有真正的好处。

template <typename T, int x, int y>
using some_name = std::conditional_t< (x>y), T, int >;

template <typename T, int x, int y>
some_name<T, x, y> SomeFunction() {
    return 0;
}

如您所见,语言已经非常具有表现力。

一些样板文件:

template<class T> struct tag{using type=T;};
template<class Tag> using type_t=typename Tag::type;

template<int x> using int_t = std::integral_constant<int, x>;
template<int x> constexpr int_t<x> int_v = {};

returns 标记类型的代码,基于参数的类型,以函数 (C++14) 的形式:

template<class T, int x, int y>
constexpr auto evalToType( int_t<x>, int_t<y> )
{
   return std::conditional_t< (x>y), tag<T>, tag<int> >{};
}

template<class T, int x, int y>
type_t<decltype(evalToType(int_v<x>, int_v<y>))>
SomeFunction() {
  return 0;
}

您可以将 type_t<decltype()> 替换为:

#define TYPE_T(...) type_t<decltype(__VA_ARGS__)>

如果你愿意。

template<class T, int x, int y>
TYPE_T(evalToType(int_v<x>, int_v<y>))
SomeFunction() {
  return 0;
}

这很有趣。