Вы можете использовать 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);
Вы можете создать вспомогательную функцию, которая пересылает 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);
}
Как вы можете создать псевдоним / указатель на шаблонную функцию?
Вы можете создать псевдоним переменной типа указателя на функцию:
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