Простой способ передать временную структуру значением в C++?

Предположим, что я хочу передать временный объект в функцию. Существует ли способ сделать это в 1 строке кода по сравнению с 2 со структурой?


С классом я могу сделать:

class_func(TestClass(5, 7));

данный:

class TestClass
{
private:
    int a;
    short b;

public:
    TestClass(int a_a, short a_b) : a(a_a), b(a_b)
    {
    }

    int A() const
    {
        return a;
    }

    short B() const
    {
        return b;
    }
};

void class_func(const TestClass & a_class)
{
    printf("%d %d\n", a_class.A(), a_class.B());
}

Теперь, как я делаю это со структурой? Самое близкое, которое я имею:

test_struct new_struct = { 5, 7 };
struct_func(new_struct);

данный:

struct test_struct
{
    int a;
    short b;
};

void struct_func(const test_struct & a_struct)
{
    printf("%d %d\n", a_struct.a, a_struct.b);
}

Объект более прост, но интересно, существует ли способ сделать членскую инициализацию структуры правильно в соответствии с вызовом функции, не давая структуре конструктора. (Я не хочу конструктора. Целая причина я использую структуру, состоит в том, чтобы избежать, чтобы шаблон получил/установил конвенции класса в этом единичном случае.)

9
задан Matthew 6 February 2010 в 07:04
поделиться

5 ответов

Альтернативой предоставлению конструктора в вашей структуре, было бы предоставление свободной функции make_xxx:

struct Point {int x; int y;};

Point makePoint(int x, int y) {Point p = {x, y}; return p;}

plot(makePoint(12, 34));

Одна из причин, по которой вы можете захотеть избежать использования конструкторов в структурах, это позволить брауз-инициализацию в массивах структур:

// Not allowed when constructor is defined
const Point points[] = {{12,34}, {23,45}, {34,56}};

vs

const Point points[] = {Point(12,34), Point(23,45), Point(34,56)};
8
ответ дан 4 December 2019 в 13:47
поделиться

Это можно сделать так же, как и в классе. Просто дайте структуре конструктор, и вы можете создать его в линию, как и структуру. Ваши возражения по поводу использования конструктора необоснованны. Основным отличием класса от структуры является связанная с ним видимость по умолчанию. Для занятий это личное; для структур, общедоступных. Нет «шаблона,» и не нужно подчиняться «условностям,» которые ты не хочешь.

struct test_struct
{
    int a;
    short b;

    test_struct(int a_, int b_): a(a_), b(b_) { }
};

struct_func(test_struct(5, 7));
-121--3320676-

Структуры также могут иметь конструкторы, поэтому с ними можно делать то же самое, что и с примером класса.

-121--3320678-

Это возможно в стандарте C++ 11 . В основном, вы можете сделать это:

struct_func(test_struct{5, 7});

Это уже доступно в GCC начиная с версии 4.4.

5
ответ дан 4 December 2019 в 13:47
поделиться

Вы можете сделать это так же, как и с классом. Просто дайте своей структуре конструктор, и вы можете создать его встроенным, как и структуру. Ваши возражения против использования конструктора безосновательны. Основное различие между классом и структурой - это связанная с ним видимость по умолчанию. Для классов это личное; для структур, паблик. Нет никакого «шаблона», и вам не нужно подчиняться никаким «условностям», которых вы не хотите.

struct test_struct
{
    int a;
    short b;

    test_struct(int a_, int b_): a(a_), b(b_) { }
};

struct_func(test_struct(5, 7));
2
ответ дан 4 December 2019 в 13:47
поделиться

Я не эксперт по C ++, но не могли бы вы просто разместить создание внутри списка аргументов вашего вызова функции?

0
ответ дан 4 December 2019 в 13:47
поделиться

У структур также могут быть конструкторы, поэтому с ними можно делать то же самое, что и в примере с классом.

0
ответ дан 4 December 2019 в 13:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: