boost :: enable_if类模板方法

时间:2010-05-30 03:34:50

标签: c++ templates boost sfinae

我上课时使用了模板方法:

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 个答案:

答案 0 :(得分:12)

您的C未参与apply的扣除。有关代码失败原因的详细说明,请参阅this answer

您可以这样解决:

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) {
        }
};