1

私は現在このマクロを持っています

#define bind(OBJECT, ROLE) \
assert( sizeof(*ROLE) == 1 ); \
ROLE = reinterpret_cast<decltype(ROLE)>(OBJECT);

名前の競合の問題が発生しているため、これを次のようなテンプレート化された関数に移動したいと思います

template<typename T1, typename T2>
void bind(T1 obj, T2 r) {
    assert( sizeof(*r) == 1 );
    r = reinterpret_cast<T2>(obj);
};

しかし、これは不可能だと思いますが、これについて確認したいですか? r を変更するには、ポインターへのポインターが必要ですか?

4

2 に答える 2

3

少なくとも参照が必要です。

template<typename T1, typename T2>
void bind(T1 obj, T2& r)
{
    assert( sizeof(*r) == 1 );
    r = reinterpret_cast<T2>(obj);
}

もう 1 つのオプションは、テンプレート変換演算子を使用することです。次に、次の構文で呼び出すことができます。

ROLE = bind(OBJ);

コードは多かれ少なかれ次のようになります。

template<typename T1> class auto_converter
{
    const T1& value;
public:
    auto_converter(const T1& v) : value(v) {}

    // template conversion operator
    template<typename T2>
    operator T2() const
    {
        assert(sizeof (*T2()) == 1);
        return reinterpret_cast<T2>(value);
    }
};

template<typename T1>
autoconverter<T1> bind(const T1& obj) { return obj; }
于 2012-07-16T20:07:14.227 に答える
2

変更するには、r を参照として宣言します。

template<typename T1, typename T2>
void bind(T1 obj, 
          T2 &r) //<-- here 
{
    assert( sizeof(*r) == 1 );
    r = reinterpret_cast<T2>(obj);
};
于 2012-07-16T20:06:40.093 に答える