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;
}
这很有趣。
因为有很多建议,所以我想问一下 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;
}
这很有趣。