结构字段作为模板参数

时间:2011-03-24 21:12:46

标签: c++ templates

我在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 ) );

它工作正常。但现在我想将EqualByField1 typedef移动到结构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 个答案:

答案 0 :(得分:2)

你的问题并不难看:-)
虽然我并非百分之百地确信这真的符合您的目标,但以下情况如下 解决方案可能会有所帮助:

struct S {
    int field1;

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

希望这有帮助

答案 1 :(得分:1)

您的代码已经正确无误。至少你展示的部分。编译器认为&S::field1&(S::field1)。但是你写的不是,因为它正确地希望有一个成员指针。

这似乎是编译器相关的问题。