簡體   English   中英

根據構造函數參數進行模板類型推導

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM