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

标签: c++ templates visual-c++


【解决方案1】:

这只是一个“模板模板参数”。语法非常接近您的想象。这里是:

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;
}

您的用例应该像您发布的那样工作。

【讨论】:

    【解决方案2】:

    使用的方式是正确的。但是你的函数模板定义本身是错误的。

    应该是这样的:

    template<template<typename Ty> class FunctorT> //<---here is the correction
    Something MergeSomething(const Something& lhs, const Something& rhs)
    

    并且不需要Ty。事实上,它在那里毫无意义。您可以完全省略它。

    请参阅 Stephen C. Dewhurst 的这篇文章:

    【讨论】:

    • 我认为您必须在第一个“
    • @dario_ramos:没关系:ideone.com/S639B。编写 &gt;&gt; 时需要空间,在 C++03 中应为 &gt; &gt;。这在 C++0x 中已修复。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-24
    相关资源
    最近更新 更多