使用模板化的变量类型执行特定于上下文的操作
Perform context specific action with templated variable type
这个问题被标记为使用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
。
如果为变量提供上下文没有问题,可以这样做:
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;
};
你现在必须声明变量如下:
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});
PS:你应该把Variable::name
和Variable::context
设为私有
相关文章:
- 为什么在popback()操作之后,它仍然打印完整的矢量
- #为""定义宏;静态";针对不同的上下文
- 重载操作程序时出错>>用于类中的字符串 memebr
- 与互斥锁相比,旋转锁可以保证上下文切换
- 线程,如果else语句,都是错误的上下文切换后,会发生什么
- 对字符串进行位操作
- 为什么我不能使用 EGL 创建无头 OpenGl 上下文?
- 我可以在 C++ 中的函数体之外进行操作吗?
- MPI突然停止了对多个核心的操作
- 如何在信号处理程序和普通函数中对全局变量进行互斥读写操作
- Visual Studio(或任何其他工具)能否将地址解释为调用堆栈(boost上下文)的开头
- 对字符数组中的元素执行逐位操作
- 如何在directx/c++中进行平移/缩放操作
- 逐位操作的隐式类型转换
- 为什么在逗号分隔符上下文中将预增量的结果强制转换为void
- 为什么一个向量上的多线程操作很慢
- 排序时无法执行交换操作.我做的时候它会崩溃.为什么
- 如何在Qt中获取文件系统操作的上下文菜单
- OpenCL OpenGL 互操作上下文创建失败
- 使用模板化的变量类型执行特定于上下文的操作