如何将模板作为模板参数传递给模板?

问题描述:

我想写类似:如何将模板作为模板参数传递给模板?

  // 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

会不会有一个简单的'template '就足够了,然后通过'MergeSomething >;否则''boost :: function'或'boost :: bind'封面下的顶峰可能会给一些见解。 – AJG85 2011-06-13 19:31:19

+0

@ AJG85:否 - 如果你看一下示例代码,我将在我自己的函数模板中使用不同的模板参数调用模板函数。 – 2011-06-13 19:31:57

+0

啊是的,所以你是我想这是简化的代码和类型确定并不是那么微不足道的实际。好的问题,我想我可能有一些通用的存储类,可以从这样的事情中受益。 – AJG85 2011-06-13 20:05:28

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

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

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

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

它应该是这样的:不需要

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

而且Ty。其实它在那里毫无意义。您可以完全省略它。

请参阅本文由Stephen C.杜赫斯特:

+0

我想你必须在第一个“ 2011-06-13 19:28:33

+3

@dario_ramos:多数民众赞成好:http://www.ideone.com/S639B。当你编写在C++ 03中的'>>'应该是'>>'时需要空格。这在C++ 0x中得到了修复。 – Nawaz 2011-06-13 19:36:34