使用模板化的变量类型执行特定于上下文的操作

Perform context specific action with templated variable type

本文关键字:操作 上下文 执行 变量 类型      更新时间:2023-10-16

这个问题被标记为使用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::nameVariable::context设为私有