此问题被标记为使用boost
保持动态多态性的解决方案的重复,即使我明确声明我不能使用boost
。
我希望有多个在其他地方实例化的上下文。
现在我们要将键值变量设置为类型T
的某个值,与上下文相关。
variable
类是将任意类型设置为某个值的句柄。
每个上下文以不同方式处理变量设置(即这些是图形后端。)为此,Context::magically_set
方法可以专门用于每个受支持的T
。
但是每个上下文都以不同方式处理每个受支持的T
。
如果可以模拟虚拟成员函数,那么这是我的“工作”代码:
class Context {
public:
template<typename T>
virtual void magically_set(const T &value);
};
class ContextA : public Context {
public:
template<typename T>
void magically_set(const std::string &name, const T &value) override;
// somewhere else: T-specific implementation for this context.
};
class ContextB : public Context {
public:
template<typename T>
void magically_set(const std::string &name, const T &value) override;
// somewhere else: T-specific implementation for this different context.
};
template<typename T>
class Variable {
public:
Variable(std::string name, Context *context)
: name{name}, context{context} {}
void set(const T &value) {
this->context->magically_set(this->name, value);
}
std::string name;
Context *context;
};
和用法:
ContextB ctx_b;
Variable<float> test{"index", &ctx_b};
Variable<vec3> vectest{"color", &ctx_b};
test.set(0.1337f);
vectest.set({0.0, 0.0, 1.0});
我该如何使这项工作?我可以使用c ++ 14支持的任何内容,但不能使用boost
。
答案 0 :(得分:1)
如果您没有向Context提供Context的问题,您可以执行以下操作:
var results =
this.Context.Database.SqlQuery<MyPoco>(
"spName @param1, @param2, @param3",
new SqlParameter("@param1", var1),
new SqlParameter("@param2", var2),
new SqlParameter("@param3", var3));
您现在必须按如下方式声明变量:
template<typename T, typename C>
class Variable {
public:
Variable(std::string name, C &context)
: name{name}, context{context} {}
void set(const T &value) {
this->context->magically_set(this->name, value);
}
std::string name;
C &context;
};
PS:你应该typedef ContextB ActiveContext;
ContextB ctx_b;
Variable<float, ActiveContext> test{"index", ctx_b};
Variable<vec3, ActiveContext> vectest{"color", ctx_b};
test.set(0.1337f);
vectest.set({0.0, 0.0, 1.0});
和Variable::name
私有。