是否可以在struct
内获取“当前struct
”的类型?
例如,我想做这样的事情:
struct foobar {
int x, y;
bool operator==(const THIS_TYPE& other) const /* What should I put here instead of THIS_TYPE? */
{
return x==other.x && y==other.y;
}
}
我试着这样做:
struct foobar {
int x, y;
template<typename T>
bool operator==(const T& t) const
{
decltype (*this)& other = t; /* We can use `this` here, so we can get "current type"*/
return x==other.x && y==other.y;
}
}
但它看起来很难看,需要支持最新的C ++标准版,而MSVC不能编译它(它会因“内部错误”而崩溃)。
实际上,我只是想编写一些预处理器宏来自动生成像operator==
这样的函数:
struct foobar {
int x, y;
GEN_COMPARE_FUNC(x, y);
}
struct some_info {
double len;
double age;
int rank;
GEN_COMPARE_FUNC(len, age, rank);
}
但我需要知道宏内部的“当前类型”。
答案 0 :(得分:0)
实际上,你可以使用这样的想法。
#define GEN_COMPARE_FUNC(type, x, y)\
template<typename type>\
bool operator ==(const type& t) const\
{\
return this->x == t.x && this->y == t.y;\
}
struct Foo
{
int x, y;
GEN_COMPARE_FUNC(Foo, x, y);
};
我不知道,怎么用var。以这种方式进行宏解析(我们需要抛出参数并比较每个参数和t,我不知道,如何在宏中扩展参数)。
答案 1 :(得分:0)
此堆栈溢出URL指出boost库可以计算表达式的类型,但C / C ++本身不能:
Getting name and type of a struct field from its object
有人也提出了类似的问题:
How can I add reflection to a C++ application?
开始使用typeof包括typeof标头:
#include <boost/typeof/typeof.hpp>
要在编译时推导出表达式的类型,请使用BOOST_TYPEOF宏:
namespace ex1
{
typedef BOOST_TYPEOF(1 + 0.5) type;
BOOST_STATIC_ASSERT((is_same<type, double>::value));
}