gpt4 book ai didi

c++ - 模板c++的模板?

转载 作者:可可西里 更新时间:2023-11-01 18:28:46 24 4
gpt4 key购买 nike

我已经成功地创建了一些具有我们期望的所有东西的 preperty 类。我的意思是在使用它时,您不需要仅使用 operator = 来调用函数会做所有的工作。但只有一件事我想如果我们能解决就好了:

template <class T, class X,void (T::*setFunc)(const X&),const X& (T::*getFunc)()const> class property
{
T* const owner;
X data;
friend T;
property(T*const pOwner) : owner (pOwner)
{
}
public:
property& operator = (const X& input){(owner->*setFunc)(input);return *this;}
operator const X&()const {return (owner->*getFunc)();}
};

struct c
{
protected:
void setInt(const int& data);
const int& getInt() const;
public:
c();
property<c, int ,&setInt,&getInt> myInt;
};

c::c() : myInt(this)
{
}

void c::setInt(const int& data)
{
myInt.data = data;
}
const int& c::getInt() const
{
return myInt.data;
}

请参阅类属性有 4 个参数,第一个参数是类类型本身。我想知道我们是否可以做任何事情来从两个函数指针属性需求中提取类类型。类似 property <int, &setInt, &getInt> myInt; 的东西.

你知道消除第一个模板参数的方法吗?

最佳答案

如果您想省略明确指定类型参数,以下代码将达到目的。但是,此代码需要 VC2010。

template <class> struct class_type;
template <class C, class T> struct class_type< T(C::*) > { typedef C type; };

template <class> struct param_type;
template <class C, class T> struct param_type< void(C::*)(const T&) > {
typedef T type;
};

template <class S, S setFunc, class G, G getFunc> struct property {
typedef typename class_type<S>::type T;
typedef typename param_type<S>::type X;
T* const owner;
X data;
....
};

#define PROPERTY(set, get) property<decltype(&set), &set, decltype(&get), &get>

struct c {
void setInt(const int& data);
const int& getInt() const;
PROPERTY(setInt, getInt) myInt;
};

顺便说一下,MSVC 有自己的 property .如果能达到目的,这可能会更容易。

关于c++ - 模板c++的模板?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6569716/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com