C++ 带宏参数的指针函数的映射
我正在尝试创建一个包含构造函数的映射。为此,我使用以下方法: 所以在DLL中,我有如下数据结构:C++ 带宏参数的指针函数的映射,c++,templates,dictionary,macros,function-pointers,C++,Templates,Dictionary,Macros,Function Pointers,我正在尝试创建一个包含构造函数的映射。为此,我使用以下方法: 所以在DLL中,我有如下数据结构: namespace pods { struct PODS_API StructExample{ double d; bool b; int i; StructExample() : d(0), b(false), i(0) {}; StructExample(QList<QVariant> paramList) :
namespace pods
{
struct PODS_API StructExample{
double d;
bool b;
int i;
StructExample() : d(0), b(false), i(0) {};
StructExample(QList<QVariant> paramList) :
d(paramList[0].toDouble()),
b(paramList[1].toBool()),
i(paramList[2].toInt())
{};
StructExample(double param_d, bool param_b, int param_i) : d(param_d), b(param_b), i(param_i) {};
};
REGISTER_VARIABLE_TYPE(StructExample);
}
namespace variable{
template <class T>
class VariableT : public AbstractVariableT<T>, public IVariable {
public:
VariableT() {};
VariableT(const QString& name, const QList<QVariant> listParam) : name(name), item(T(listParam)) {};
~VariableT(){};
T* getData()
{
return &item;
};
void setData(T* t)
{
item = *t;
};
private:
T item;
};
}
这个问题经过编辑
谢谢你的帮助。
Eric不清楚你在问什么,你能提供一个答案吗?(只是一个猜测:
VariableT
应该是宏中的Variable##T
)你好,丹尼尔,谢谢你的帮助。不幸的是,我不能提供SSCCE。但我会尽量说清楚。好的,编辑完成了,有点长。我希望你能更好地理解我的问题。同样,欢迎任何帮助。关于变量,不是这样的。实际上我有一个叫做VariableT的类。
namespace variable
{
#define REGISTER_VARIABLE_TYPE(T) bool isRegistered_##T = \
VariableFactory::instance()-> \
regVariable<T>(#T, (VariableT<T>::createVariable)(const QString&, const QList<QVariant>&));
template <class T>
class AbstractVariableT : public QObject
{
public:
static IVariable* createVariable(const QString& name, const QList<QVariant>& listParam) { return new VariableT<T>(name,listParam); }
virtual ~AbstractVariableT(){};
protected:
QString name;
};
}
namespace variable
{
class VariableFactory
{
public:
static VariableFactory* instance();
static IVariable* createVariable(const QString& idVariable, const QString& name, const QList<QVariant>& listParam);
template <class T>
bool regVariable(const QString& idVariable, IVariable* (*creator)(const QString&, const QList<QVariant>&))
{
variableCreators[idVariable] = creator;
return true;
}
private:
QMap<QString, IVariable* (*)(const QString&, const QList<QVariant>&)> variableCreators;
};
}
"StructExample"/AbstractVariableT::CreateVariable<StructExample>(const QString& name, const QList<QVariant>& listParam);
#define REGISTER_VARIABLE_TYPE(T) bool isRegistered_##T = VariableFactory::instance()->regVariable<T>(#T, (VariableT<T>::createVariable)(const QString&, const QList<QVariant>&));
IVariable* VariableFactory::createVariable(const QString& typeVariable, const QString& name, const QList<QVariant>& listParam)
{
return instance()->variableCreators[typeVariable](name, listParam);
}
Error 1 error C2653: 'VariableFactory' : is not a class or namespace name
Error 5 error C2275: 'pods::StructExample' : illegal use of this type as an expression
Error 2 error C2227: left of '->regVariable' must point to class/struct/union/generic type
Error 8 error C2143: syntax error : missing ')' before 'const'
Error 4 error C2065: 'VariableT' : undeclared identifier
Error 7 error C2065: 'createVariable' : undeclared identifier
Error 9 error C2059: syntax error : ')'
Error 3 error C2039: 'VariableT' : is not a member of 'variable'
Error 6 error C2039: 'createVariable' : is not a member of '`global namespace''
Error 10 error C1903: unable to recover from previous error(s); stopping compilation