簡體   English   中英

c ++替代成員定義

[英]c++ alternative member definition

在C ++中,您可以通過以下方式定義成員:

struct test {
    using memberType = int(int);
    /*virtual*/ memberType member;
};

int test::member(int x) { return x; }

使用C ++ 14有沒有辦法在類定義中定義成員,例如使用lambda?

我不認為這是可能的,但如果成員是指向函數的指針,你可以這樣做

struct test {
    int (*member)(int) = [](int x){return x;};
};

因為具有空捕獲列表的lambda實際上是常規函數

我能想到使用std::function<>對象的唯一方法,但你必須傳遞實例(不能想到如何自動綁定..)

struct foo {
    using T = int(foo&, int);

    int b;
    std::function<T> x = [](foo& f, int a) { return a * f.b; };
};

你想寫這樣的東西:

struct test {
  auto member_impl = [this]() {
  };
};

這(至少)三個計數失敗:

  1. 您不能聲明非靜態成員auto

  2. 你不能命名lambda的類型(所以它必須是自動的)

  3. this在定義課程時不可用。

簡短的回答,沒有。

但你可以寫:

struct test {
  auto member_impl() {
  };
};

它差不多。

我猜5.1.5 / 3是什么阻止你使用lambda的方式,我很抱歉:

[...] lambda表達式不應出現在未評估的操作數(Clause [expr]),模板參數,別名聲明,typedef聲明或函數或函數模板的聲明中在其函數體和默認參數之外。 [注意:目的是防止lambda出現在簽名中。 - 尾注] [...]

也就是說,C ++ 14允許您使用模板定義成員類型,如下例所示:

template<typename F>
struct S;

template<typename R, typename... Args>
struct S<R(Args...)> {
    using member = R(Args...);
    R operator()(Args...) { return R{}; }
    member M;
};

template<typename R, typename... Args>
R S<R(Args...)>::M(Args...) { return R{}; }

int main() { S<void(int)> s; }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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