好吧,如果你可以使用RTTI,你可以定義一個MultiFuncObject
這樣的,你可以很容易綁定等功能。此外,你可以輕鬆地打電話給他們。但不幸的是,這種方法僅適用於有限的參數。但實際上boost::bind
也支持有限數量的參數(默認爲9)。所以你可以擴展這個類來滿足你的需求。
在給你MultiFuncObject
的來源之前,我想告訴你如何使用它。它將一個模板參數用作返回類型。您可以將新功能綁定到+=
運算符。通過一些模板魔法,類可以用至少一個不同的參數類型區分具有相同參數計數的綁定函數之間的差異。
您需要C++ 11,因爲MultiFuncObject
使用std::unordered_map
和std::type_index
。
下面是用法:
#include <iostream>
using namespace std;
void _1() {
cout << "_1" << endl;
}
void _2(char x) {
cout << "_2" << " " << x << endl;
}
void _3(int x) {
cout << "_3" << " " << x << endl;
}
void _4(double x) {
cout << "_4" << " " << x << endl;
}
void _5(int a, int b) {
cout << "_5" << " " << a << " " << b << endl;
}
void _6(char a, int b) {
cout << "_6" << " " << a << " " << b << endl;
}
void _7(int a, int b, int c) {
cout << "_7" << " " << a << " " << b << " " << c << endl;
}
int main() {
MultiFuncObject<void> funcs;
funcs += &_1;
funcs += &_2;
funcs += &_3;
funcs += &_4;
funcs += &_5;
funcs += &_6;
funcs += &_7;
funcs();
funcs('a');
funcs(56);
funcs(5.5);
funcs(2, 5);
funcs('q', 6);
funcs(1, 2, 3);
return 0;
}
我希望這是接近你想要什麼。下面是MultiFuncObject
源:
#include <typeinfo>
#include <typeindex>
#include <unordered_map>
using namespace std;
template <typename R>
class MultiFuncObject {
unordered_map<type_index, void (*)()> m_funcs;
public:
MultiFuncObject<R> operator +=(R (* f)()) {
m_funcs[typeid(R())] = (void (*)()) f;
return *this;
}
template <typename A1>
MultiFuncObject<R> operator +=(R (* f)(A1)) {
m_funcs[typeid(R(A1))] = (void (*)()) f;
return *this;
}
template <typename A1, typename A2>
MultiFuncObject<R> operator +=(R (* f)(A1, A2)) {
m_funcs[typeid(R(A1, A2))] = (void (*)()) f;
return *this;
}
template <typename A1, typename A2, typename A3>
MultiFuncObject<R> operator +=(R (* f)(A1, A2, A3)) {
m_funcs[typeid(R(A1, A2, A3))] = (void (*)()) f;
return *this;
}
R operator()() const
{
unordered_map<type_index, void (*)()>::const_iterator it = m_funcs.find(typeid(R()));
if (it != m_funcs.end()) {
R (*f)() = (R (*)())(it->second);
(*f)();
}
}
template <typename A1>
R operator()(A1 a1) const
{
unordered_map<type_index, void (*)()>::const_iterator it = m_funcs.find(typeid(R(A1)));
if (it != m_funcs.end()) {
R (*f)(A1) = (R (*)(A1))(it->second);
(*f)(a1);
}
}
template <typename A1, typename A2>
R operator()(A1 a1, A2 a2) const
{
unordered_map<type_index, void (*)()>::const_iterator it = m_funcs.find(typeid(R(A1, A2)));
if (it != m_funcs.end()) {
R (*f)(A1, A2) = (R (*)(A1, A2))(it->second);
(*f)(a1, a2);
}
}
template <typename A1, typename A2, typename A3>
R operator()(A1 a1, A2 a2, A3 a3) const
{
unordered_map<type_index, void (*)()>::const_iterator it = m_funcs.find(typeid(R(A1, A2, A3)));
if (it != m_funcs.end()) {
R (*f)(A1, A2, A3) = (R (*)(A1, A2, A3))(it->second);
(*f)(a1, a2, a3);
}
}
};
它使用std::unordered_map
與std::type_index
鍵和的void (*)()
值存儲不同函數原型。需要時,使用該地圖檢索正確的功能。
Here is the working example
[C++ 11可變參數的std ::函數參數](http://stackoverflow.com/q/9242234/1708801)似乎接近比賽。 –
@ShafikYaghmour只將問題轉移到模板,變量類型不能相同,並且同時保持兩個函數。我不能使std ::向量的不同功能,例如 –
你能提供一個實際的實際用例嗎?沒有一個實際的用例,答案只是把語法放在牆上。 「類似這樣的事情」是非常含糊的,而且就像你得到的那樣具體。然後你繼續關於'bind',這與「這樣的事情」的例子不同。再次,一個實際的用例/問題來解決所有的噪音。這意味着編寫軟件時遇到的實際具體問題。我可以想出10個可能回答你的問題的答案,但哪一個可以幫助你取決於*你實際想要做什麼*。 – Yakk