From cd0d0ca5304528e33eb10e87ea27936f38bfea1e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juan=20M=20G=C3=B3mez?= Date: Fri, 15 Sep 2023 11:08:41 +0100 Subject: [PATCH] Document C++ Initializers (#22704) Co-authored-by: Andreas Rumpf --- doc/manual_experimental.md | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/doc/manual_experimental.md b/doc/manual_experimental.md index 72e883cbc3..dd28fa67c1 100644 --- a/doc/manual_experimental.md +++ b/doc/manual_experimental.md @@ -2382,6 +2382,33 @@ In the example above `CppClass` has a deleted default constructor. Notice how by Notice when calling a constructor in the section of a global variable initialization, it will be called before `NimMain` meaning Nim is not fully initialized. +Constructor Initializer +======================= + +By default Nim initializes `importcpp` types with `{}`. This can be problematic when importing +types with a deleted default constructor. In order to avoid this, one can specify default values for a constructor by specifying default values for the proc params in the `constructor` proc. + +For example: + +```nim + +{.emit: """/*TYPESECTION*/ +struct CppStruct { + CppStruct(int x, char* y): x(x), y(y){} + int x; + char* y; +}; +""".} +type + CppStruct {.importcpp, inheritable.} = object + +proc makeCppStruct(a: cint = 5, b:cstring = "hello"): CppStruct {.importcpp: "CppStruct(@)", constructor.} + +(proc (s: CppStruct) = echo "hello")(makeCppStruct()) +# If one removes a default value from the constructor and passes it to the call explicitly, the C++ compiler will complain. + +``` + Member pragma =============