Ich habe die folgende Klasse:Sollte ich() oder {} beim Weiterleiten von Argumenten verwenden?
struct foo
{
std::size_t _size;
int* data;
public:
explicit foo(std::size_t s) : _size(s) { }
foo(std::size_t s, int v)
: _size(s)
{
data = new int[_size];
std::fill(&data[0], &data[0] + _size, v);
}
foo(std::initializer_list<int> d)
: _size(d.size())
{
data = new int[_size];
std::copy(d.begin(), d.end(), &data[0]);
}
~foo() { delete[] data; }
std::size_t size() const { return _size; }
};
Und ich möchte Argumente es wie folgt zu übermitteln:
template <typename... Args>
auto forward_args(Args&&... args)
{
return foo{std::forward<Args>(args)...}.size();
//--------^---------------------------^
}
std::cout << forward_args(1, 2) << " " << forward_args(1) << " "
<< forward_args(2) << "\n";
Wenn ich ersetzen {}
mit ()
der Ausgang 1 1 2
ist statt 2 1 1
.
Was wäre für meine Klasse am sinnvollsten?
"Was wäre für meine Klasse am sinnvollsten?" Dies hängt davon ab, was Ihre Klasse tun soll. '{}' bevorzugt 'std :: initialiser_list','() 'nicht. Von dort kommt der Unterschied. Nur * Sie * wissen, wie die Klasse sich verhalten soll und was sie daher tun soll. – Angew
Sie sollten vermeiden, dass diese Contractors gleichzeitig sind. Sie können ein Tag hinzufügen, um explizit zu sein: 'foo (size_with_value_tag, std :: size_t s, int v)'. – Jarod42