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

时间:2015-08-28 16:39:35

标签: c++ templates c++11 c++14

此问题被标记为使用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

1 个答案:

答案 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私有。