簡體   English   中英

在 C++ 中干凈地將 void 處理為 labmda 的通用返回類型

[英]Cleanly handling void as generic return type of labmda in C++

我正在嘗試像這樣編寫 function :

template <typename T>
void testActionBehavesIdentically(Foo& fooA, Foo& fooB, std::function<T(Foo&)> action)
  if (std::is_same<T, void>::value)
  {
    // perform action even if T is void
    action(fooA);
    action(fooB);
  }
  else
  {
    // if T is not void, test also return values
    T resultA = action(fooA);
    T resultB = action(fooB);
    CHECK_EQUAL(resultA, resultB);
  }
  // tests that the state of both foos is the same
  CHECK_EQUAL(fooA, fooB);
}

其中T有時是void 編譯(在 VS2019 上)失敗並error C2182: 'resultA': illegal use of type 'void' 有干凈的方法嗎? (希望能在大多數標准編譯器中編譯)? 謝謝你。

現在發生的事情是編譯器仍然會編譯兩個if分支(因為它實際上不知道在運行時之前會調用哪個分支)。 這會導致失敗,因為其中一個分支無法正確編譯。 有幾個修復(來自評論):

如果您的編譯器支持它,這將是一種選擇:

  if constexpr (std::is_same<T, void>::value) {
    // perform action even if T is void
    action(fooA);
    action(fooB);
  } else {
    ...
  }

這實際上只會根據 T 的類型編譯一個分支。

如果您的編譯器不支持它,這里有另一種選擇:

template <typename T>
void testActionBehavesIdentically(Foo& fooA, Foo& fooB, std::function<T(Foo&)> action) {
    // check assuming T != void
}

// overload which will be called if T was void
void testActionBehavesIdentically(Foo& fooA, Foo& fooB, std::function<void(Foo&)> action) {
    // check assuming T == void
}

當 T 為 void 時,編譯器將匹配重載,而不是分派到 function 的通用版本。 在這里你甚至可以說“如果 T 是一個int做一些不同的事情”,這有點整潔(但可能會變得混亂)。

暫無
暫無

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

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