【发布时间】:2011-09-14 04:10:43
【问题描述】:
我正在尝试写类似的东西:
// 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);
我该怎么做?
【问题讨论】:
-
不会是一个简单的
template <typename Ty>就足够然后通过MergeSomething<typename std::plus<Something>>;否则也许boost::function或boost::bind的掩护下的一个高峰可以提供一些见解。 -
@AJG85:不——如果你看一下示例代码,我会在我自己的函数模板中使用不同的模板参数调用模板函数。
-
啊,是的,所以我猜这是简化的代码,实际上类型确定并不是那么微不足道。好问题,我想我可能有一些通用的存储类可以从这样的东西中受益。
-
@AJG85:不,这是实际代码。看看我在代码中是如何得到 FunctorT
() 的——如果你不将它作为模板传递,那么你传递的是实例化而不是模板本身,这意味着你不能更改附加的类型给它。 -
@Billy 编译器不会为每个实例简单地生成一个类型吗?如果
FunctorT的模板是在MergeSomething之外和之前定义的,那么它适用于任何一个,并且只需根据MergeSomething的调用选择正确的模板......不必执行switch的if语句基于类型通常是模板代码的一个优势。
标签: c++ templates visual-c++