C++ doesn't actually have named arguments as a language feature Ñ unlike Python (foo(x=1, y=2)), you can't pass arguments by name in standard C++. However, there are several idiomatic ways to simulate them: 1. Designated Initializers (C++20) Ñ closest to "real" named args #include struct WindowConfig { int width = 800; int height = 600; bool fullscreen = false; const char* title = "Untitled"; }; void openWindow(WindowConfig cfg) { std::cout << cfg.title << " " << cfg.width << "x" << cfg.height << (cfg.fullscreen ? " [fullscreen]" : "") << "\n"; } int main() { openWindow({ .title = "My App", .width = 1920, .height = 1080 }); openWindow({ .fullscreen = true }); // rest use defaults } Output: My App 1920x1080 Untitled 800x600 [fullscreen] This is the most practical modern approach. Fields can be omitted (defaults apply), and the names make the call site self-documenting. ?? Designated initializers must be in declaration order Ñ you can't reorder them. 2. Method Chaining / Named Parameter Idiom (C++11 and up) #include class Query { std::string table_; int limit_ = 10; bool ascending_ = true; public: Query& from(std::string t) { table_ = t; return *this; } Query& limit(int n) { limit_ = n; return *this; } Query& descending() { ascending_ = false; return *this; } void run() const { std::cout << "SELECT * FROM " << table_ << " LIMIT " << limit_ << (ascending_ ? " ASC" : " DESC") << "\n"; } }; int main() { Query().from("users").limit(5).descending().run(); } Output: SELECT * FROM users LIMIT 5 DESC This is the builder pattern Ñ very readable and order-independent. 3. Strong Typedefs / Tag Types (C++11) When you have multiple parameters of the same type, wrapping them prevents mix-ups: #include struct Latitude { double value; }; struct Longitude { double value; }; struct Zoom { int value; }; void showMap(Latitude lat, Longitude lon, Zoom zoom) { std::cout << "lat=" << lat.value << " lon=" << lon.value << " zoom=" << zoom.value << "\n"; } int main() { // Hard to mix up Ñ types enforce intent showMap(Latitude{51.5}, Longitude{-0.1}, Zoom{12}); } Without this, showMap(51.5, -0.1, 12) gives no hint which is which. Summary Technique C++ Version Order-independent? Best for Designated initializers C++20 ? (decl order) Config/option structs Builder / method chaining C++11 ? Complex object construction Strong typedefs C++11 ? Preventing same-type mix-ups For most cases, designated initializers (option 1) are the cleanest modern solution.