0
我有一個模板,它將一些不同簽名的函數作爲參數,併產生一個簡單簽名的相關函數。細節不是非常重要,它是某種代表。它看起來大致如此。評估採用函數參數DRY而不使用宏的元函數?
struct foo;
using desired_signature_t = int(*)(foo*);
template <typename F, F f>
struct make_delegate;
template <typename... Args, int(*target_func)(foo*, Args...)>
struct make_delegate<int(*)(foo*, Args...), target_func> {
static int delegate(foo *) { ... }
};
要使用它,我目前做的是:
#define MAKE_DELEGATE(f) &make_delegate<decltype(f), (f)>::delegate
int bar(foo *, int, float, double);
desired_signature_t delegated_bar = MAKE_DELEGATE(&bar);
我使用宏,因爲我不喜歡輸入參數兩次,一次爲decltype,一次用於實際函數指針。
有沒有辦法做到這一點,而不用鍵入兩次,也沒有使用宏?問題是無法推導出非類型模板參數的類型,並且我找不到在先前的模板中首先推出這些類型的方法。我想過用模板構造函數構造一個字面對象作爲幫助器,但我不確定這是否有幫助 - 我仍然不能使用參數作爲ctor內部的模板參數,並且一旦我我不知道函數類型了。
Colud [此](http://stackoverflow.com/questions/37541787/create-a-stdfunction-type-with-limited-arguments)是感興趣的? – skypjack
你能提供一些關於你如何在'delegate'的定義中使用'target_func'的細節嗎?而且,知道目標是什麼總是很有趣的,因爲解決方案可能完全不同。 –
@JohanBoule:其基本思想是,'foo *'可以訪問函數期望的其餘參數。代表將盡可能提取它們,然後調用'target_func'。如果無法提取它們,則表示出現錯誤。 –