簡體   English   中英

如何在類模板中使用boost :: enable_if

[英]how to use boost::enable_if in class template

我正在嘗試使用boost :: enable_if來打開/關閉類模板中的某些功能,但始終會收到編譯錯誤錯誤:struct boost :: enable_if中沒有名為“ type”的類型

我的片段:

#include <iostream>
#include <tr1/type_traits>
#include <boost/utility.hpp>

namespace std {
    using namespace tr1;
}

template <typename T1>
struct C {
    template< typename T2 >
    void test( T2&, typename boost::enable_if<
    std::is_const< T1 >, T1 >::type* = 0 ) {

        std::cout << "const" << std::endl;
    }

    template< typename T2 >
    void test( T2&, typename boost::disable_if<
    std::is_const< T1 >, T1 >::type* = 0 ) {

        std::cout << "non-const" << std::endl;
    }
};

int main() {
    const int ci = 5;
    int i = 6;

    C<char> c;
    c.test(ci);
    c.test(i);
    return 0;
}

但是以下類似代碼可以正常工作:

#include <iostream>
#include <tr1/type_traits>
#include <boost/utility.hpp>

namespace std {
    using namespace tr1;
}

template <typename T1>
struct C {
    template< typename T2 >
    void test( T2&, typename boost::enable_if<
    std::is_const< T2 >, T1 >::type* = 0 ) {

        std::cout << "const" << std::endl;
    }

    template< typename T2 >
    void test( T2&, typename boost::disable_if<
    std::is_const< T2 >, T1 >::type* = 0 ) {

        std::cout << "non-const" << std::endl;
    }
};

int main() {
    const int ci = 5;
    int i = 6;

    C<char> c;
    c.test(ci);
    c.test(i);
    return 0;
}

我要實現的是基於類模板中聲明的類型來禁用/啟用某些成員函數。 實際上,不需要模板成員函數。 僅為SFINAE添加了它們。

任何人都可以幫忙嗎?

謝謝!

SFINAE (用於實現enable_if的機制)僅在功能模板的模板參數的上下文中起作用。 在您的情況下, T1是封閉類模板的模板參數,而不是功能模板本身的模板參數。 從功能模板的角度來看,它是固定類型,不能按照聲明中的拼寫方式使用它是正常錯誤,而不是替代失敗。

一種方法是類本身的專用化,如果您只想對某些功能執行此操作,則可以將其作為基類:

template <typename T1>
struct B {
    template<typename T2>
    void test( T2& ) {

        std::cout << "non-const" << std::endl;
    }
};

template <typename T1>
struct B< const T1 > {
    template<typename T2>
    void test( T2& ) {

        std::cout << "const" << std::endl;
    }
};

template <typename T1>
struct C : B<T1> {
    //...
};

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM