У нас есть класс, который помогает нам отправлять данные в telegraf / influenxdb (т. Е. Для мониторинга).Это выглядит примерно так:
class TelegrafSend {
public:
// // Constructor does some default stuff based on binary name and context.
TelegrafSend();
// Destructor sends the object.
~TelegrafSend();
// Exists in a couple variants. Probably could have been a template.
void AddTag(const std::string& tag_name, const std::string& tag_value);
// Same.
void AddField(const std::string& field_name, const int field_value);
};
Для ясности, это выглядит так:
TelegrafSend TelegrafSend::AddField(const string& field_name, const int field_value) {
fields_[field_name] = to_string(field_value);
sent_ = false;
return *this;
}
И это прекрасно работает:
TelegrafSend telegraf;
telegraf.AddTag("a_tag", "a_value");
telegraf.AddField(kTelegrafCount, 1);
и как этовыходит из области видимости, отправляется, что является хорошим поведением, потому что функция может добавить пару метрик при выполнении, и все выходы из функции вызывают отправку объекта.
Теперь у меня появилась умная идея:
class TelegrafSend {
public:
// // Constructor does some default stuff based on binary name and context.
TelegrafSend();
// Destructor sends the object.
~TelegrafSend();
// Exists in a couple variants. Probably could have been a template.
TelegrafSend AddTag(const std::string& tag_name, const std::string& tag_value);
// Same.
TelegrafSend AddField(const std::string& field_name, const int field_value);
};
и поэтому я могу написать
TelegrafSend telegraf.AddTag("a_tag", "a_value").AddField(kTelegrafCount, 1);
Проблема здесь в том, что я создаю временные файлы, и поэтому, пока это работает в конце, каждое возвращение создает временное, которое получаетуничтожены и отправлены в телеграф.Это действительно неэффективно для influenxdb, даже не говоря о дурной практике в C ++.
Я пробовал пару вариантов обратных ссылок на rvalue, но я либо пытаюсь вернуть ссылку на временную переменную или переменную стека, либочто-то одинаково глупое.Примеры, которые я нашел в работе, делают так много, что я не совсем точно знаю, что делать.Или я пытаюсь сделать что-то синтаксическое, чего не должен делать?