Поле структуры как параметр шаблона - PullRequest
2 голосов
/ 25 марта 2011

У меня есть код в MSVC 2008:

template< class T, class FieldType, FieldType T::*FieldPtr >
struct EqualBy {
    EqualBy( const FieldType & value ) : m_filedValue( value ) {}
    bool operator()( const T & r ) const {
        return m_filedValue == r.*FieldPtr;
    }
private:
    const FieldType m_filedValue;
};

...

struct S {
    int field1;
    ...
};
typedef EqualBy< S, int, &S::field1 > EqualByField1;

...

typedef std::vector< S > SVect;
SVect v;
SVect::const_iterator found = std::find_if( v.begin(), v.end(), EqualByField1( 42 ) );

, он отлично работает.Но теперь я хочу переместить typedef типа EqualByField1 в struct S. как этот

struct S {
    int field1;
...

    typedef EqualBy< S, int, &S::field1 > EqualByField1;
};

, чтобы уменьшить область действия этого typedef и «украсить» код вызывающего абонента следующим образом

SVect::const_iterator found = std::find_if( v.begin(), v.end(), S::EqualByField1( 42 ) );

но я получил следующие ошибки

ошибка C2327: 'S :: field1': не является именем типа, статическим или перечислителем
ошибка C2065: 'field1': необъявленный идентификатор

Вопрос в том, существует ли какое-либо решение этой проблемы, кроме как для получения из S подобного

struct SS : public S {
    typedef EqualBy< S, int, &S::field1 > EqualByField1; // it works, but I do not want to derive :)
};

Спасибо.И извините за мой уродливый английский:)

Ответы [ 2 ]

2 голосов
/ 25 марта 2011

Ваш вопрос не безобразен: -)
Хотя я не уверен на 100%, что это действительно соответствует вашей цели, может помочь следующий обходной путь:

struct S {
    int field1;

    template< class T >
    struct TEqualByField1 {
        typedef EqualBy< T, int, &T::field1 > type;
    };
    typedef TEqualByField1< S >::type EqualByField1;
};

Надеюсь, это поможет

1 голос
/ 25 марта 2011

Ваш код уже правильный. По крайней мере, те части, которые вы показали. Компилятор считает, что &S::field1 - это &(S::field1). Но то, что вы написали не так, так как оно правильно хочет иметь указатель на член.

Похоже, это проблема, связанная с компилятором.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...