我正在尝试写一些类似的东西:
// I don't know how this particular syntax should look...
template<typename template<typename Ty> FunctorT>
Something MergeSomething(const Something& lhs, const Something& rhs)
{
Something result(lhs);
if (lhs.IsUnsigned() && rhs.IsUnsigned())
{
result.SetUnsigned(FunctorT<unsigned __int64>()(lhs.UnsignedValue(), rhs.UnsignedValue()));
}
else
{
result.SetSigned(FunctorT<__int64>()(lhs.SignedValue(), rhs.SignedValue()));
}
return result;
}
将使用如下:
Something a, b;
Something c = MergeSomething<std::plus>(a, b);
我该怎么做?
答案 0 :(得分:19)
这只是一个“模板模板参数”。语法非常接近您的想象。这是:
template< template<typename Ty> class FunctorT>
Something MergeSomething(const Something& lhs, const Something& rhs)
{
Something result(lhs);
if (lhs.IsUnsigned() && rhs.IsUnsigned())
{
result.SetUnsigned(FunctorT<unsigned __int64>()(lhs.UnsignedValue(), rhs.UnsignedValue()));
}
else
{
result.SetSigned(FunctorT<__int64>()(lhs.SignedValue(), rhs.SignedValue()));
}
return result;
}
您的用例应该像发布它一样工作。
答案 1 :(得分:12)
使用的方式是正确的。但是你的函数模板定义本身是错误的。
应该是这样的:
template<template<typename Ty> class FunctorT> //<---here is the correction
Something MergeSomething(const Something& lhs, const Something& rhs)
不需要Ty
。事实上,那里毫无意义。你可以完全省略它。
请参阅Stephen C. Dewhurst的这篇文章: