我正在学习使用可变模板编写代码,并编写了一个简单的可变模板来进行实验。编译器报告模板参数为1的m_bindingObj成员变量无效。我错过了什么?
#include <iostream>
#include <functional>
class ClassA
{
public:
static ClassA * construct(int varA, int varB, int varC)
{
return new ClassA(varA, varB, varC);
}
ClassA(int varA, int varB, int varC)
: m_varA(varA)
, m_varB(varB)
, m_varC(varC) {}
static std::function<ClassA *(int, int, int)> getBinding() { return std::bind(&ClassA::construct, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3); }
int m_varA;
int m_varB;
int m_varC;
};
template <typename T>
class ToolFactory
{
public:
template <typename... Args>
static T * invoke(Args... args)
{
std::function<T*(Args...)> creator = getCreator<Args...>();
return creator(args...);
}
template <typename... Args> static std::function<T*(Args...)> getCreator() {
return T::getBinding();
}
template <typename... Args> static std::function<T*(Args...)> m_bindingObj;
};
template <typename T> std::function<T*(Args...)> ToolFactory<T>::m_bindingObj;
int main()
{
ToolFactory<ClassA>::invoke(1, 2, 3);
return 0;
}
使用bobah提供的修复的拼写错误,我重新编写了示例,其中显示了使用m_bindingObj的示例。
#include <iostream>
#include <functional>
class ClassA
{
public:
static ClassA * construct(int varA, int varB, int varC)
{
return new ClassA(varA, varB, varC);
}
ClassA(int varA, int varB, int varC)
: m_varA(varA)
, m_varB(varB)
, m_varC(varC) {}
static std::function<ClassA *(int, int, int)> getBinding() { return std::bind(&ClassA::construct, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3); }
int m_varA;
int m_varB;
int m_varC;
};
class ClassB
{
public:
static ClassA * construct(int varA, int varB, int varC)
{
return new ClassA(varA, varB, varC);
}
static std::function<ClassA *(int, int, int)> getBinding() { return std::bind(&ClassB::construct, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3); }
};
template <class T>
class ToolFactory
{
public:
template <typename... Args>
static T * create(Args... args)
{
return m_bindingObj<Args...>(args...);
}
template<typename... Args> static void setBinding(std::function<T*(Args...)> functor) {
m_bindingObj<Args...> = functor;
}
template <typename... Args> static std::function<T*(Args...)> m_bindingObj;
};
template<class T> template<typename... Args> std::function<T*(Args...)> ToolFactory<T>::m_bindingObj = T::getBinding();
int main()
{
ToolFactory<ClassA>::setBinding(ClassB::getBinding());
ClassA * instance = ToolFactory<ClassA>::create(1, 2, 3);
return 0;
}
发布于 2018-09-19 03:56:01
如果您需要variable template语法支持,那么您需要使用C++14
,而且几乎没有输入错误。如果能看到一个m_bindingObj
成员变量的用法示例,那就太好了,因为我的变量是否正确取决于此。
template <typename T>
class ToolFactory
{
...
template <typename... Args> static std::function<T*(Args...)> m_bindingObj;
};
template <typename T>
template <typename... Args>
std::function<T*(Args...)> ToolFactory<T>::m_bindingObj;
https://stackoverflow.com/questions/52393483
复制相似问题