Boost.TTI を使ってみる


Boost.TTI が利用できるよさげなネタがあったので書いてみました。

[ソース]

#include <boost/tti/has_member_function.hpp>


BOOST_TTI_HAS_MEMBER_FUNCTION(close)
// => has_member_function_close

struct custom_deleter{
    template<typename T>
    void
    operator ()(T* p,
        typename std::enable_if<
            has_member_function_close<void (T::*)()>::value
        >::type* = 0
    ) const{
        p->close();
        delete p;
    }
    template<typename T>
    void
    operator ()(T* p,
        typename std::enable_if<
            has_member_function_close<void (T::*)(int)>::value
        >::type* = 0
    ) const{
        p->close(100);
        delete p;
    }
};


#include <memory>
#include <type_traits>
#include <iostream>


struct Hoge{
    Hoge() {}
    ~Hoge() {}
    void close() {
        std::cout << "Hoge::close" << std::endl;
    };
};

struct Fuga{
    Fuga() {}
    ~Fuga() {}
    void close(int i) {
        std::cout << "Fuga::close" << std::endl;
    };
};


int
main(){
    {
        std::shared_ptr<Hoge> hoge(new Hoge(), custom_deleter());
        std::shared_ptr<Fuga> fuga(new Fuga(), custom_deleter());
    }
    return 0;
}

[出力]

Fuga::close
Hoge::close


こんな感じで has_xxx のメタ関数を簡単に定義することが出来ます。
これでメタプログラミングが捗りますね。

[boost]

  • ver 1.54.0