gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:16:55 27 4
gpt4 key购买 nike

这个问题被标记为与使用 boost 来保持动态多态性的解决方案重复,即使我明确声明我不能使用 boost

我想要在其他地方实例化多个上下文。现在我们要将键值变量设置为 T 类型的某个值,与上下文相关。

变量 类是将任意类型设置为某个值的句柄。

每个上下文以不同方式处理变量设置(即这些是图形后端。)为此,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 设为私有(private)。

关于c++ - 使用模板变量类型执行上下文特定操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32275876/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com