2016-06-19 78 views
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內部的模板參數,並且一旦我我不知道函數類型了。

+0

Colud [此](http://stackoverflow.com/questions/37541787/create-a-stdfunction-type-with-limited-arguments)是感興趣的? – skypjack

+2

你能提供一些關於你如何在'delegate'的定義中使用'target_func'的細節嗎?而且,知道目標是什麼總是很有趣的,因爲解決方案可能完全不同。 –

+0

@JohanBoule:其基本思想是,'foo *'可以訪問函數期望的其餘參數。代表將盡可能提取它們,然後調用'target_func'。如果無法提取它們,則表示出現錯誤。 –

回答