У меня есть вопрос о шаблонах, которые можно использовать с параметрами, которые являются классом или примитивным типом. Вот пример кода:
(Примечание: у меня есть более сложный реальный код, следующий код бесполезен, но воспроизводит ту же проблему)
template<typename T>
class Foo
{
T value;
public:
Foo() {}
const T& getValue() const { return value; }
Foo& setValue(const T& other) {
value = other; return *this;
}
};
struct Bar
{
int x;
Bar() : x(3) {}
};
int doit()
{
Foo<int> fooint;
Bar bar;
bar.x = 44;
Foo<Bar> foobar;
fooint.setValue(3); // warning here
foobar.setValue(bar);
int y = foobar.getValue().x + fooint.getValue();
return y;
}
Я получаю замечание компилятора о fooint.setValue()
:
value copied to temporary, reference to temporary used
Я понимаю замечание. Что меня интересует, так это то, как мне следует обрабатывать Foo::setValue()
, если я собираюсь использовать Foo как с примитивами, так и с типами классов / структур в качестве параметров шаблона.
Я думал, setValue(const T& other)
была правильной сигнатурой метода для передачи константного класса по ссылке.
Есть ли способ сделать setValue (), чтобы он "правильно делал" как для Foo<int>
, так и для Foo<Bar>
?