2011-06-13 179 views
16

我想寫類似:如何將模板作爲模板參數傳遞給模板?

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

回答

17

這僅僅是一個 「模板的模板參數」。語法非常接近你的想象。這裏是:

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

你的用例應該像你發佈的那樣工作。

11

你的方式使用這是正確的。但是你的函數模板定義本身是錯誤的。

它應該是這樣的:不需要

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

相關問題