Saya memiliki fungsi yang membutuhkan dua argumen:
template <typename T1, typename T2>
void foo(T1 arg1, T2 arg2)
{ std::cout << arg1 << " + " << arg2 << '\n'; }
Dan satu variadic yang harus meneruskan argumennya secara berpasangan:
template <typename... Args>
void bar(Args&&... args) {
static_assert(sizeof...(Args) % 2 == 0);
( foo( std::forward<Args>(args), std::forward<Args>(args) ), ... );
// ^ Sends each argument twice, not in pairs
}
Saya ingin bar(1,2,3,4)
menelepon foo(1,2)
danfoo(3,4)
Apakah ada cara untuk melakukan itu?
c++
c++11
templates
variadic-templates
Fourmet
sumber
sumber
Jawaban:
Anda dapat mencapainya dengan kelebihan.
HIDUP
Perhatikan bahwa dengan cuplikan minimum di atas saat menelepon
bar
dengan argumen 0 atau ganjil Anda tidak akan mendapatkan kesalahan fungsi yang cocok . Jika Anda ingin pesan kompilasi yang lebih jelas denganstatic_assert
Anda dapat mulai dari potongan ini .sumber
Rekursi sederhana menggunakan
if constexpr
:Sebut seperti ini:
Demo
Saya akan mengatakan bahwa jawaban songyanyao cukup kanonik pra-C ++ 17. Setelah itu,
if constexpr
telah memungkinkan kami untuk memindahkan logika ke badan fungsi kami daripada menggunakan trik kelebihan.sumber
C ++ 17 generalisasi untuk
n
-ary functors:sumber