2012-02-16 27 views
3

假設我有一個不上的任意容器類型(C++ 11)一些功能:傳遞一個函數模板等功能

template<class containerType> 
void bar(containerType& vec) { 

     for (auto i: vec) { 
       std::cout << i << ", "; 
     } 

     std::cout << '\n'; 
} 

我可以這樣從另一個函數調用這個函數:

void foo() { 
     std::vector<int> vec = { 1, 2, 3 }; 
     bar(vec); 
} 

現在假設我有不同的功能一樣吧,我想通過這些功能爲foo之一,那麼富會是這個樣子:

template<class funcType> 
void foo(funcType func) { 
    std::vector<int> vec = { 1, 2, 3 }; 
    func(vec); 
} 

然而,像這樣調用foo:

foo(bar); 

不工作(很明顯,因爲酒吧是不是功能,而是一個函數模板)。有沒有什麼好的解決方案?我如何定義foo來完成這項工作?

編輯:這是一個最小的可編譯例子,如在評論中要求......

#include <iostream> 
#include <vector> 
#include <list> 

template<class containerType> 
void bar(containerType& vec) { 

     for (auto i: vec) { 
       std::cout << i << ", "; 
     } 

     std::cout << '\n'; 
} 

template<typename funcType> 
void foo(funcType func) { 

     std::vector<int> vals = { 1, 2, 3 }; 
     func(vals); 

} 

int main() { 
     // foo(bar); - does not work. 
} 
+0

您缺少最小的可編譯示例 – 2012-02-16 09:39:43

+1

爲什麼使用使用函數指針?我相信在這裏使用函子會更好。 – AlexTheo 2012-02-16 10:27:20

+0

@AlexTheo感謝您的評論。當然,使用函子的解決方案很簡單!鮑勃發布了類似的解決方案作爲答案。我會去的! – fdlm 2012-02-16 10:51:30

回答

2

這樣的事情? (未完全清醒,可能會錯過了點)

#include <iostream> 
#include <vector> 
#include <list> 

struct Test{ 
template<class containerType> 
static void apply(containerType& vec) { 

     for (auto it = vec.begin(); it != vec.end(); ++it) { 
       std::cout << *it << ", "; 
     } 

     std::cout << '\n'; 
} 
}; 

template<class FuncStruct> 
void foo() { 

     std::vector<int> vals; 
     vals.push_back(1); 
     FuncStruct::apply(vals); 

} 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    foo<Test>(); 
    return 0; 
} 
+0

謝謝!就像@AlexTheo在評論中指出的那樣,使用仿函數可能是最簡單的解決方案。 – fdlm 2012-02-16 10:53:40

3

如果你知道富工程爲int的載體,你可以通過bar< std::vector<int> >功能。

合理的解決方案是定義foo的模塊也爲所使用的容器定義typedef。那麼你甚至不需要bar成爲一個模板。

+0

感謝您的回答。我更喜歡foo的調用者不知道foo如何在內部工作 - 他只知道他必須傳遞一個在任意容器上運行的函數。 – fdlm 2012-02-16 10:19:53

+0

@fldm:請參閱編輯。 – 2012-02-16 10:36:29

+1

@fdlm但該函數不能在任意容器上運行。它是一個模板函數,因此可以將它看作在編譯時爲所需容器類型創建函數。 – juanchopanza 2012-02-16 10:37:56

4

在線演示在http://ideone.com/HEIAl

這允許你做foo(bar)。我們不通過模板函數或模板類,而是傳入具有模板成員函數的非模板類。

#include <iostream> 
#include <vector> 
#include <list> 

struct { 
    template<class containerType> 
    void operator() (containerType& vec) { 

     for (auto i = vec.begin(); i!=vec.end(); ++i) { 
       std::cout << *i << ", "; 
     } 

     std::cout << '\n'; 

    } 
} bar; 

template<typename funcType> 
void foo(funcType func) { 

     std::vector<int> vals = { 1, 2, 3 }; 
     func(vals); 

} 

int main() { 
     foo(bar); 
} 
相關問題