假設我有這樣的事情:lambdas中的虛擬參數將匹配任何類型?
struct Foo {};
struct Bar {};
struct Baz {};
// ...
void RegisterListener1(std::function<void(Foo)>);
void RegisterListener2(std::function<void(Bar)>);
void RegisterListener3(std::function<void(Baz)>);
哪裏有Foo
,Bar
和Baz
之間沒有任何關係。
現在,假設我想通過這些寄存器函數的每一個相同的lambda,忽略其參數。有什麼我可以放在lambda的參數列表中,意思是「在這裏匹配任何東西;我只是要拋出這個東西」?
auto listener = [](/* what? */) { throw UnsupportedOperationException(); };
RegisterListener1(listener);
RegisterListener2(listener);
RegisterListener3(listener);
我可以用一個函數模板,而不是一個拉姆達的和做這樣的事情:
template<typename T>
void listener(T)
{
throw UnsupportedOperationException();
}
// ...
RegisterListener1(listener<Foo>);
RegisterListener2(listener<Bar>);
RegisterListener3(listener<Baz>);
但這是乏味的,特別是如果仿函數參數的三個註冊函數模板本身,從而有沒有簡單的方法來寫出「內部」參數類型。下面是發生在我在打字的過程中另一個想法:
struct Anything
{
template<typename T> Anything(const T&) {}
};
// ...
auto listener = [](Anything) { throw UnsupportedOperationException(); };
RegisterListener1(listener);
RegisterListener2(listener);
RegisterListener3(listener);
我與實際好吧,也許我不需要問這個問題了,但有一個更美好選項?
如果你正在創建一個結構,你可能會拋開lambda,只是使用一個仿函數。 – 2014-09-25 14:52:54