Цепные операторы неявного преобразования - PullRequest
3 голосов
/ 23 декабря 2011

У меня есть класс, который мне нужно неявно преобразовать в несколько вещей с промежуточными значениями, например,

struct outer {
    struct inner {
        operator T() { return T(); }
    };
    operator inner() { return inner(); }
};

Если у меня есть эта структура, она всегда действительнаделать, например,

void f(T t);
outer o;
f(o);

Ответы [ 2 ]

9 голосов
/ 23 декабря 2011

§13.3.3.1.2 [over.ics.user] p1

Пользовательская последовательность преобразования состоит из начальной стандартной последовательности преобразования, за которой следует пользовательского преобразования (12.3), за которой следует вторая стандартная последовательность преобразования.

Обратите внимание на единственное и пропущенное слово «последовательность». Во время неявной последовательности преобразования будет учитываться только одно пользовательское преобразование.

0 голосов
/ 23 декабря 2011

Это работает:

struct Foo {}; // renamed T in Foo to avoid confusion!

struct outer {
        struct inner {
                operator Foo() { return Foo(); }
        };

        operator inner() { return inner(); }

        template <typename T>
        operator T () {
                return operator inner();
        }
};

int main() {
        void f(Foo t);
        outer o;
        f(o);
}

Но только потому, что f не перегружен, поэтому это не совсем решение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...