[英]Template type deduction according to constructor argument
我有一個類模板,其構造函數接受一個類型為模板參數的可調用對象。 我想推斷出那種類型,所以我不必在實例化類時指定它。
不幸的是,類型推導在以下示例中不起作用。 有沒有辦法讓它發揮作用?
template<typename F>
class C {
public:
C(F&& f) : m_f{f} {}
private:
F m_f;
};
class D {
public:
static int s() { return 0; }
private:
C<decltype(&s)> c {&s}; // OK
C<> c2 {&s}; // error, not enough template parameters
};
https://wandbox.org/permlink/8cphYR7lCvBA8ro4
注意這類可以在類數據成員中使用Can模板參數推導嗎? 但在這里,我要求獲得類似工作的東西,而不是標准的合規性。
還有一點需要注意的是,雖然上面例子中重新指定模板參數的類型只是一個非DRY的不便(下面的一個答案建議用宏解決),我不確定它是如何可能的如果該實例是數據成員,則具有C
的實例,其中F
是非全局lambda函數類型(例如,在現場定義的那個)。 恕我直言,這種技術將非常強大和有用。
如果你的主要目標是避免打字&s
兩次,務實的解決方案是定義一個宏:
#define CC(name,value) decltype(C{value}) name{value}
class D {
public:
static int s() { return 0; }
private:
CC(c,&s);
// lambda still not possible:
// CC(c2,[](){return 42;});
};
你可以這樣做:
decltype(C{&s}) c{&s};
但我不知道有辦法避免重復&s
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.