Без поддержки C ++ 11 (decltype
) это может работать:
#include <iostream>
using namespace std;
struct A { void foo(void); };
struct Aa: public A { };
struct B { };
struct retA { int foo(void); };
struct argA { void foo(double); };
struct constA { void foo(void) const; };
struct varA { int foo; };
template<typename T>
struct FooFinder {
typedef char true_type[1];
typedef char false_type[2];
template<int>
struct TypeSink;
template<class U>
static true_type &match(U);
template<class U>
static true_type &test(TypeSink<sizeof( matchType<void (U::*)(void)>( &U::foo ) )> *);
template<class U>
static false_type &test(...);
enum { value = (sizeof(test<T>(0, 0)) == sizeof(true_type)) };
};
int main() {
cout << FooFinder<A>::value << endl;
cout << FooFinder<Aa>::value << endl;
cout << FooFinder<B>::value << endl;
cout << FooFinder<retA>::value << endl;
cout << FooFinder<argA>::value << endl;
cout << FooFinder<constA>::value << endl;
cout << FooFinder<varA>::value << endl;
}
A
, Aa
и B
являются рассматриваемыми кланами, Aa
является специальным, который наследует элемент, который мы ищем.
В FooFinder
true_type
и false_type
] - это замены для соответствующих классов C ++ 11. Также для понимания мета-программирования шаблонов они раскрывают саму основу трюка SFINAE-sizeof.
TypeSink
- это структура шаблона, которая используется позже, чтобы потопить интегральный результат sizeof
в экземпляр шаблона для формирования типа.
Функция match
- это еще один шаблон типа SFINAE, который остается без общего экземпляра. Поэтому он может быть создан только в том случае, если тип его аргумента совпадает с типом, для которого он был специализирован.
Обе функции test
вместе с объявлением перечисления окончательно образуют центральный шаблон SFINAE. Существует универсальный метод, использующий эллипсис, который возвращает false_type
и аналог с более конкретными аргументами.
Чтобы иметь возможность создать экземпляр функции test
с аргументом шаблона T
, функция match
должна быть инстанцирована, так как ее тип возврата требуется для создания экземпляра аргумента TypeSink
. Предостережение заключается в том, что &U::foo
, будучи завернутым в аргумент функции, является not , на который ссылается внутри специализации аргумента шаблона, поэтому унаследованный поиск элементов все еще имеет место.
Попробуйте и NetBeans и RadRails в течение, возможно, недели каждый, затем можно найти который работы лучше всего для Вас. Лучший совет состоит в том, чтобы изучить Ваш инструмент. Если Вы не проверяете что-то новое о своем редакторе, что-то, что могло бы потенциально сэкономить Вам время (regexp, и т.д.) затем Вы делаете себя огромная плохая услуга.
Я использовал Eclipse/Aptana/RadRails, и в отличие от Gaius были довольно довольны им. Я рекомендую Eclipse IDE для Java-разработчиков от Загрузок Eclipse: http://www.eclipse.org/downloads/
Затем захватите Studio Aptana, следуя этим инструкциям.
То, когда Eclipse перезапустит Aptana, будет иметь представление, нажмет на направляющие рада, и Вы хороши для движения. Просто удостоверьтесь, что Вам уже установили рубин, или это становится болью для разрешения.
Я использую его для всей веб-разработки - HTML, CSS, PHP, JavaScript, направляющие...
Править: Для полного раскрытия я смещаюсь к Aptana и RadRails, поскольку я знаю несколько членов исходной команды разработчиков RadRails.
Я был очень доволен E. Это довольно легко и поддерживает отрывки TextMate и команды, что означает, что Вы получаете доступ к огромной группе определенных для направляющих помощников.
Однако это - решительно редактор и не IDE, таким образом, Вы не получите отладку, созданный в консоли, и т.д. Но я нашел, что для проектов направляющих предпочитаю легкого редактора и оболочку (как Консоль) для тестов, отладки, и т.д.
IDE Netbeans является пользой, всеми вокруг редактора для многих языков. Я вполне уверен, 6,5 бет имеют поддержку Ruby on Rails, наряду с JavaScript и несколькими другими веб-языками. Это стоит проверить (Netbeans.org).
Я использовал Aptana/Eclipse/RadRails, но если бы я должен был сделать это снова, то я определенно попробовал бы NetBeans. Aptana был сильной головной болью.
Я никогда не использовал IronRuby, но это могло бы заставить Вас чувствовать больше дома.
Я главным образом кодирую ColdFusion или PHP (и JS/CSS/xHTML), но баловался небольшим количеством RoR. RadRails/Apatana был большим для меня, потому что он основывался на Eclipse, который я уже использовал для своей другой работы. Это также интегрируется с Подверсией через плагин Subclipse.
Платформа Eclipse так расширяема, что стоит инвестировать немного времени в учиться, но с другой стороны мне нравится иметь единственный IDE вместо того, чтобы иметь необходимость переключиться между различными приложениями.
Я кратко посмотрел на Netbeans, но Eclipse TBH просто чувствовал себя лучше для меня, и сам Aptana является большим, когда Вы приезжаете, чтобы сделать что-либо в JavaScript.
YMMV...
Я использую Emacs в Windows.
Установка и настройка это для работы с направляющими является боль все же.