2009-09-07 2 views
8

Возможно ли перегрузить операторы класса C++ в статическом контексте? напримерПерегрузка статического оператора C++

class Class_1{ ... } 
int main() 
{ 

    Class_1[val]... 

} 
+0

В случае, если 'Class_1 [вал]' выход в тип? Как вы ожидаете сделать 'Class_1 [val] v;'? –

+1

Я собирался получить интегральные значения, но типы в порядке. – jameszhao00

+0

В C++ типы не могут быть представлены в системе типов (есть только 'std :: type_id'), и я не могу думать о каком-либо операторе, который может быть перегружен статически. Я предлагаю вместо того, чтобы спросить, возможна ли ваша идея реализации на C++, вы представляете фактическую _проблему_, которая должна была решить. Кто-то может предложить возможную реализацию. – sbi

ответ

13

Если вы ищете метапрограммирование с помощью встроенного оператора: такая вещь невозможна - встроенные операторы работают со значениями времени выполнения, а не по значениям времени компиляции.

Вы можете использовать boost::mpl для этого, и вместо того, чтобы использовать встроенные операторы, использовать свои шаблоны, как at для op[], plus<a, b> для op+ и т.д.

int main() { 
    using boost::mpl::vector; 
    using boost::mpl::at_c; 
    using boost::mpl::plus; 
    using boost::mpl::int_; 

    typedef vector<int, bool, char, float> Class_1; 
    typedef vector< int_<1>, int_<2> > Numeric_1; 

    at_c<Class_1, 0>::type six = 6; 
    typedef plus<at_c<Numeric_1, 0>::type 
       ,at_c<Numeric_1, 1>::type>::type r; 
    int i3[r::value] = { 4, 5, 6 }; 
    return ((i3[0] + i3[1] + i3[2]) * six) == 90; 
} 
3

Если вы имеете в виду оператор работает на классе, № Это не имеет смысла, это как сказать, operator + мая оператор на int или double. Операторы являются синтаксическим сахаром для функций, и они работают с переменными (значениями), а не типами.

+1

Имеет смысл, если у вас есть какой-то класс утилиты - только с статическими членами - который загружает что-то в «себя», что тогда вы хотели бы получить доступ самым простым способом - с использованием оператора типа '[]'. –

+1

Да, добавив комментарий @ jave.web: он может иметь смысл в случаях *, когда в статическом объеме * класса есть данные. (OP также упоминает статическую область явно). Таким образом, не с простой арифметикой, как в вашем примере, но такие вещи, как [],(), <<, > и т. Д., Могут быть идеальным синтаксическим сахаром для любых классов сложных менеджеров , не заставляя одноэлементный экземпляр. –

5

Я не верю, что это возможно, хотя я мог ошибаться на этом фронте. Я хотел бы спросить, почему вы хотите это сделать. Вместо того, чтобы выполнять операции над классом вместо экземпляров, возможно, вам просто нужен один экземпляр во всем приложении? В этом случае вы, вероятно, должны использовать the singleton pattern.

+1

Раньше я использовал одноэлементный шаблон, похожий на сумасшедший, но затем остановился, потому что одноэлементный код - это такая проблема, с которой нужно писать тесты. – jameszhao00

1

Нет, операторы не могут быть статическими членами класса. Вместо этого используйте обычную статическую функцию.

Смежные вопросы