mirror of
https://github.com/ToruNiina/toml11.git
synced 2025-12-16 03:08:52 +08:00
doc: add heterogeneous array to README
This commit is contained in:
68
README.md
68
README.md
@@ -1455,9 +1455,77 @@ There are some unreleased features in toml-lang/toml:master.
|
|||||||
Currently, the following features are available after defining
|
Currently, the following features are available after defining
|
||||||
`TOML11_USE_UNRELEASED_TOML_FEATURES` macro flag.
|
`TOML11_USE_UNRELEASED_TOML_FEATURES` macro flag.
|
||||||
|
|
||||||
|
To use those features, `#define` `TOML11_USE_UNRELEASED_TOML_FEATURES` before
|
||||||
|
including `toml.hpp` or pass `-DTOML11_USE_UNRELEASED_TOML_FEATURES` to your
|
||||||
|
compiler.
|
||||||
|
|
||||||
- Leading zeroes in exponent parts of floats are permitted.
|
- Leading zeroes in exponent parts of floats are permitted.
|
||||||
- e.g. `1.0e+01`, `5e+05`
|
- e.g. `1.0e+01`, `5e+05`
|
||||||
|
- [toml-lang/toml/PR/656](https://github.com/toml-lang/toml/pull/656)
|
||||||
- Allow raw tab characters in basic strings and multi-line basic strings.
|
- Allow raw tab characters in basic strings and multi-line basic strings.
|
||||||
|
- [toml-lang/toml/PR/627](https://github.com/toml-lang/toml/pull/627)
|
||||||
|
- Allow heterogeneous arrays
|
||||||
|
- [toml-lang/toml/PR/676](https://github.com/toml-lang/toml/pull/676)
|
||||||
|
|
||||||
|
### Note about heterogeneous arrays
|
||||||
|
|
||||||
|
Although `toml::parse` allows heterogeneous arrays, constructor of `toml::value`
|
||||||
|
does not.
|
||||||
|
|
||||||
|
```cpp
|
||||||
|
// this won't be compiled
|
||||||
|
toml::value v{
|
||||||
|
"foo", 3.14, 42, {1,2,3,4,5}, {{"key", "value"}}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
There is a workaround for this issue. By explicitly converting values into
|
||||||
|
`toml::value`, you can initialize `toml::value` with a heterogeneous array.
|
||||||
|
|
||||||
|
```cpp
|
||||||
|
// OK!
|
||||||
|
toml::value v{
|
||||||
|
toml::value("foo"), toml::value(3.14), toml::value(42),
|
||||||
|
toml::value{1,2,3,4,5}, toml::value{{"key", "value"}}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
The reason why the first example is not allowed is the following.
|
||||||
|
Let's assume that you are initializing a `toml::value` with a table.
|
||||||
|
|
||||||
|
```cpp
|
||||||
|
// # expecting TOML table.
|
||||||
|
toml::value v{ // [v]
|
||||||
|
{"answer", 42}, // answer = 42
|
||||||
|
{"pi", 3.14}, // pi = 3.14
|
||||||
|
{"foo", "bar"} // foo = "bar"
|
||||||
|
};
|
||||||
|
```
|
||||||
|
|
||||||
|
This is indistinguishable from a (heterogeneous) TOML array definition.
|
||||||
|
|
||||||
|
```toml
|
||||||
|
v = [
|
||||||
|
["answer", 42],
|
||||||
|
["pi", 3.14],
|
||||||
|
["foo", "bar"],
|
||||||
|
]
|
||||||
|
```
|
||||||
|
|
||||||
|
This means that the above C++ code makes constructor's overload resolution
|
||||||
|
ambiguous. So a constructor that allows both "table as an initializer-list" and
|
||||||
|
"heterogeneous array as an initializer-list" cannot be implemented.
|
||||||
|
|
||||||
|
Thus, although it is painful, you need to explicitly cast values into
|
||||||
|
`toml::value` when you initialize heterogeneous array in C++ code.
|
||||||
|
|
||||||
|
```cpp
|
||||||
|
// You need to do this when you want to initialize hetero array.
|
||||||
|
toml::value v{
|
||||||
|
toml::value("foo"), toml::value(3.14), toml::value(42),
|
||||||
|
toml::value{1,2,3,4,5}, toml::value{{"key", "value"}}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
## Breaking Changes from v2
|
## Breaking Changes from v2
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user