2015-07-14 2 views
-1

Поскольку есть множество предложений, я хотел бы спросить, существует ли такая вещь на C++ или если есть какое-либо предложение для выполнения чего-то подобного.Функция предложения на языке 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, который в основном возвращающего тип, а не значение.

+0

Если есть такое предложение, я надеюсь, что оно отклонено. –

+0

@Captain Obvlious Могу ли я спросить, почему это плохая идея? – v4ss

ответ

9

Это уже возможно, но с различным синтаксисом. Поэтому он не дает реальной выгоды для введения еще одного синтаксиса.

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; 
} 

как вы можете видеть, язык уже довольно выразителен.

+0

О, я также понял, что это действительно не очень хорошая идея, потому что сложный расчет может быть выражен в функции constexpr. Виноват :). – v4ss

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 = {}; 

код, который возвращает тэговый тип, основанный на типе аргументов, в виде функции (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; 
} 

что-то вроде забавы.

Смежные вопросы