Здравствуйте, GhostCoders, Вы писали:
GC>Да, вы все правильно предлагаете. GC>У нас было так в одном из первоначальных вариантов.
GC>Но тут смысл сделать так чтобы алгоритмы (всякие операторы работы над структурами данных) GC>работали с разными реализациями этих структур данных.
GC>В данном подходе типы данных вшиты жестко — это Key<T> и MappedVal<KT,VT>. GC>А хотелось бы чтобы они работали с любыми шаблоными типа KeyType<T> и MappedType<KT,VT>.
GC>См. решение в моем соседнем посте.
По сути, у тебя две группы шаблонов: KeyType-like и MappedType-like.
Для них переменяются разные операторы сравнения.
Если определять к какой группе относиться тип, можно по числу аргументов шаблона, то у тебя уже есть решение.
Если на число аргументов тоже нельзя опираться — можно пометить нужные типы вручную.
(+ ebnable_if для оператора сравнения.)
Эта штука называется — Koenig Name Lookup.
Поиск по гуглу много чего дает, например, Саттер: http://www.gotw.ca/gotw/030.htm.
Смысл в том, что у тебя оператор определен внутри namespace, using этого namespace отсутствует, в результате — компилятор не резолвит определенный тобой оператор.
Выход — явно указать в качестве параметра A::Key — тогда сработает Koenig Name Lookup.
Это свойство активно используется внутри STL — те же операторы в потоках ввода-вывода...
GC>Здравствуйте!
GC>Есть код который не собирается (кусок кода без смысла, показывающий суть):
...
GC>Стоит задача сделать код компилируемым без использования операторов-членов классов. GC>Какие будут идеи?
Здравствуйте, GhostCoders, Вы писали:
GC>не так. Как раз Koenig Name Lookup позволяет работать без использования using namespace,
Я про это и написал, что using namespace у тебя отсутствует и оператор не резолвится:
AF >Смысл в том, что у тебя оператор определен внутри namespace, using этого namespace отсутствует, в результате — компилятор не резолвит определенный тобой оператор.
И ниже рецепт решения: AF>>Выход — явно указать в качестве параметра A::Key — тогда сработает Koenig Name Lookup.
Здравствуйте, GhostCoders, Вы писали:
GC>Есть код который не собирается (кусок кода без смысла, показывающий суть):
Потому что синтаксис же!
Оператор, объявленный внутри класса, должен быть или членом (подразумевая this левым аргументом), или другом.
GC>Стоит задача сделать код компилируемым без использования операторов-членов классов.
Здравствуйте, GhostCoders, Вы писали:
GC>Здравствуйте!
GC>Есть код который не собирается (кусок кода без смысла, показывающий суть):
... GC>Стоит задача сделать код компилируемым без использования операторов-членов классов. GC>Какие будут идеи?
не так. Как раз Koenig Name Lookup позволяет работать без использования using namespace,
например, по ссылке что вы давали там есть такой код:
namespace NS {
class T { };
void f(T);
}
NS::T parm;
int main() {
f(parm); // OK, calls NS::f
}
метод f() вызывается из пространства NS без использования using namespace.
Здравствуйте, andrew.f, Вы писали:
AF>Здравствуйте, GhostCoders, Вы писали:
AF>Эта штука называется — Koenig Name Lookup. AF>Поиск по гуглу много чего дает, например, Саттер: http://www.gotw.ca/gotw/030.htm.
AF>Смысл в том, что у тебя оператор определен внутри namespace, using этого namespace отсутствует, в результате — компилятор не резолвит определенный тобой оператор. AF>Выход — явно указать в качестве параметра A::Key — тогда сработает Koenig Name Lookup.
AF>Это свойство активно используется внутри STL — те же операторы в потоках ввода-вывода...
GC>>Здравствуйте!
GC>>Есть код который не собирается (кусок кода без смысла, показывающий суть): AF>...
GC>>Стоит задача сделать код компилируемым без использования операторов-членов классов. GC>>Какие будут идеи?
Да, вы все правильно предлагаете.
У нас было так в одном из первоначальных вариантов.
Но тут смысл сделать так чтобы алгоритмы (всякие операторы работы над структурами данных)
работали с разными реализациями этих структур данных.
В данном подходе типы данных вшиты жестко — это Key<T> и MappedVal<KT,VT>.
А хотелось бы чтобы они работали с любыми шаблоными типа KeyType<T> и MappedType<KT,VT>.
См. решение в моем соседнем посте.
Здравствуйте, Chorkov, Вы писали:
C>Здравствуйте, GhostCoders, Вы писали:
GC>>Здравствуйте!
GC>>Есть код который не собирается (кусок кода без смысла, показывающий суть): C>... GC>>Стоит задача сделать код компилируемым без использования операторов-членов классов. GC>>Какие будут идеи?
Смысл сделать так чтобы алгоритмы (всякие операторы работы над структурами данных)
работали с разными реализациями этих структур данных.
Если делать их членами классов, то для каждого нового класса нужно их реализовывать.
Но полиморфизм использовать не хочется, нужно compile time полиморфизм.
Тут другом делать их не обязательно так как эти структуры — это обычные структуры (с открытыми полями).
Подразумевается что каждая реализация таких структур будут предоставлять минимальный функционал (operator[], и некоторые другие).
Здравствуйте, Кодт, Вы писали:
К>Здравствуйте, GhostCoders, Вы писали:
GC>>Есть код который не собирается (кусок кода без смысла, показывающий суть):
К>Потому что синтаксис же! К>Оператор, объявленный внутри класса, должен быть или членом (подразумевая this левым аргументом), или другом.
GC>>Стоит задача сделать код компилируемым без использования операторов-членов классов.
К>Откуда такая задача встала?
Здравствуйте, lxa, Вы писали:
lxa>Так, например, не работает.
странно, у нас собирается.
lxa>Может, так?
к сожалению не подходит, смысл в разделении алгоритмом от обрабатываемых структур данных.
То есть алгоритмы должны быть весьма независимы от структур данных над которыми они работают.