别名模板化函数

时间:2014-10-03 17:56:30

标签: c++

您可以使用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);

2 个答案:

答案 0 :(得分:7)

您可以创建一个辅助函数,转发到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);
}

答案 1 :(得分: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>()

指向函数的技巧是你必须指定所有类型的参数来获取函数的地址,因此,你需要所有参数&#39;显式给定或模板化的类型。不幸的是,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