метод шаблона класса boost :: enable_if - PullRequest
9 голосов
/ 30 мая 2010

Я получил класс с шаблонными методами, который выглядит так:

struct undefined {};

template<typename T> struct is_undefined : mpl::false_ {};

template<> struct is_undefined<undefined> : mpl::true_ {};

template<class C>
struct foo {
        template<class F, class V>
        typename boost::disable_if<is_undefined<C> >::type
            apply(const F &f, const V &variables) {
        }

        template<class F, class V>
        typename boost::enable_if<is_undefined<C> >::type
            apply(const F &f, const V &variables) {
        }
};

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

Спасибо

1 Ответ

12 голосов
/ 30 мая 2010

Ваш C не участвует в вычете за apply. См. этот ответ для более глубокого объяснения того, почему ваш код не работает.

Вы можете решить это так:

template<class C>
struct foo {    
        template<class F, class V>
        void apply(const F &f, const V &variables) { 
            apply<F, V, C>(f, variables); 
        }

private:
        template<class F, class V, class C1>
        typename boost::disable_if<is_undefined<C1> >::type
            apply(const F &f, const V &variables) {
        }

        template<class F, class V, class C1>
        typename boost::enable_if<is_undefined<C1> >::type
            apply(const F &f, const V &variables) {
        }
};
...