使用函数模板实例作为属性访问器

问题描述

我正在使用 Microsoft 的 __declspec(property()) 语言扩展为一组数据提供各种访问器。我试图通过使用函数模板来减少我实际上必须编写的访问器函数数量,但我无法让它工作。 MSDN 网站上关于你能做什么和不能做什么的信息并不多,所以有点棘手。

理想情况下,我想要这样的东西:

struct vec2
{
    float x,y;
    vec2(float x,float y) : x(x),y(y) {}
};

struct vec4
{
    union 
    {
        struct { float x,y,z,w; };
        float data[4];
    };
    
    template <int a,int b> inline vec2 get()
    {
        return vec2(data[a],data[b]);
    }
    
    template <int a,int b> inline void set(const vec2& v)
    {
        data[a] = v.x;
        data[b] = v.y;
    }
    
    // Specifying explicit template parameters does not work and gives
    // a Syntax error on character '<'
    __declspec(property(get = get<0,0>)) vec2 xx;
    __declspec(property(get = get<0,1>,put = set<0,1>)) vec2 xy;
    __declspec(property(get = get<0,2>,2>)) vec2 xz;
    __declspec(property(get = get<0,3>,3>)) vec2 xw;
    // etc
};

int main(int argc,char *argv[])
{
    vec4 v;
    
    v.xy = vec2(1.f,2.f);
    
    return 0;
}

我还考虑过可能使用 std::bind 将整数常量作为函数参数而不是模板参数传递,但同样,您在 get 中允许写入的内容似乎非常有限{1}} 和 put 字段。如果一切都失败了,我将使用脚本生成所有代码,但我想知道是否有办法解决这个问题。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)