Псевдоним шаблонной функции

Вы можете использовать typedef для создания более короткого и простого имени для типов:

typedef std::chrono::high_resolution_clock Clock;
typedef Clock::time_point TimePoint;
typedef std::chrono::seconds Seconds;
typedef std::chrono::milliseconds Milliseconds;

А также для экземпляров шаблонных типов:

typedef std::chrono::duration<float, std::ratio<1>> RealDuration;

// Example usage
float dt = RealDuration(a - b).count();

И для указателей на функции:

typedef void (*FuncPtr)(int,int);

Вы также можете использовать псевдонимы типов для шаблонов:

template<typename T> using uptr = std::unique_ptr<T>;

// Example usage
uptr<int> myInt;
uptr<foo> myFoo;

Но как вы можете создать псевдоним / указатель на шаблонную функцию? Например, если я хочу использовать имя DurationCast для записи таких вещей:

x = DurationCast<Seconds>(a - b);
y = DurationCast<Milliseconds>(c - d);

Что нужно сделать, чтобы сократить функцию std::chrono::duration_cast<T>() чтобы просто DurationCast<T>() без просто using namespace std::chrono; или же using std::chrono::duration_cast; маршрут, и без написания собственных функций объектов для его достижения?

РЕДАКТИРОВАТЬ:
Я думаю, что я могу просто написать простую обертку вокруг этого:

template<typename ToType, typename FromType>
ToType DurationCast(const FromType& d)
{
return std::chrono::duration_cast<ToType>(d);
}

Не работает как псевдоним, но в результате я могу использовать его точно так же, как я стремился:

x = DurationCast<Seconds>(a - b);

10

Решение

Вы можете создать вспомогательную функцию, которая пересылает duration_cast:

template <typename T, typename U>
auto DurationCast(U const& u) -> decltype(std::chrono::duration_cast<T>(u))
{
return std::chrono::duration_cast<T>(u);
}
6

Другие решения

Как вы можете создать псевдоним / указатель на шаблонную функцию?

Вы можете создать псевдоним переменной типа указателя на функцию:

template <typename T>
void foo()
{
std::cout << "foo!" << (T)3.14f << std::endl;
}

template <typename T>
constexpr void(*foo_alias)() = &foo<T>;

int main()
{
foo_alias<int>();    // 3
foo_alias<float>();  // 3.14
}

Например, если я хочу иметь возможность использовать имя DurationCast (…) Что нужно сделать, чтобы сократить функцию std::chrono::duration_cast<T>() чтобы просто DurationCast<T>() ?

Уловка с указателем на функцию заключается в том, что вам нужно указать все типы аргументов, чтобы получить адрес функции, поэтому вам нужны явно заданные или заданные типы всех параметров. К несчастью, std::chrono::duration_cast принимает три параметра:

template <typename T, class Rep, class Period>
constexpr T(*DurationCast)(const std::chrono::duration<Rep, Period>&) = &std::chrono::duration_cast<T, Rep, Period>;

std::chrono::seconds s(1);
std::chrono::milliseconds ms = DurationCast<std::chrono::milliseconds, float, std::ratio<1>>(s);
//                                                                     ~~~~^  ~~~~~~~~~~~~^
//                                                       explicit representation and period

DEMO

5

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector