Определение ваших собственных явных конверсий - PullRequest
2 голосов
/ 31 августа 2011

Предположим, что если преобразование из одного типа в другой тип недоступно при явном приведении, например, static_cast, можно ли определить для него явные операторы преобразования?

Редактировать :

Я ищу способ определения операторов явного преобразования для следующего:

class SmallInt {

public:

    // The Default Constructor
    SmallInt(int i = 0): val(i) {
        if (i < 0 || i > 255)
        throw std::out_of_range("Bad SmallInt initializer");
    }

    // Conversion Operator
    operator int() const {
        return val;
    }

private:
    std::size_t val;

};

int main()
{
     SmallInt si(100);

     int i = si; // here, I want an explicit conversion.
}

Ответы [ 3 ]

3 голосов
/ 31 августа 2011

Для пользовательских типов вы можете определить оператор приведения типа . Синтаксис для оператора:

operator <return-type>()

Вы также должны знать, что неявные операторы приведения типов обычно не одобряются, потому что они могут допустить слишком большую свободу действий компилятора и вызвать неожиданное поведение. Вместо этого вы должны определить to_someType() функций-членов в вашем классе для выполнения преобразования типов.


Не уверен в этом, но я считаю, что C ++ 0x позволяет вам указать приведение типа explicit для предотвращения неявных преобразований типов.

2 голосов
/ 31 августа 2011

В текущем стандарте преобразования из вашего типа в другой тип не могут быть помечены explicit, что до некоторой степени имеет смысл: если вы хотите явно преобразовать, вы всегда можете предоставить функцию, которая реализует преобразование:

struct small_int {
   int value();
};
small_int si(10);
int i = si.value();   // explicit in some sense, cannot be implicitly converted

Опять же, может не иметь особого смысла , поскольку в следующем стандарте, если ваш компилятор его поддерживает, вы можете пометить оператор преобразования как explicit:

struct small_int {
   explicit operator int();
};
small_int si(10);
// int i = si;                 // error
int i = (int)si;               // ok: explicit conversion
int j = static_cast<int>(si);  // ok: explicit conversion
0 голосов
/ 31 августа 2011

Если это то, что вам нужно, вы можете определить операторы преобразования, например:

void foo (bool b) {}

struct S {
   operator bool () {return true;} // convert to a bool
};

int main () {
   S s;
   foo (s);  // call the operator bool.
}

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

...