gpt4 book ai didi

c++ - 使用变量实例化模板函数

转载 作者:行者123 更新时间:2023-11-28 05:40:01 27 4
gpt4 key购买 nike

我在一个类中有三个指针,每个指针都是模板化结构的实例。我正在尝试使用返回类型相应不同的 get<>() 方法来检索它们中的任何一个。

//Example program
#include <iostream>
#include <map>
#include <string>
#include <boost/shared_ptr.hpp>
#include <boost/variant.hpp>
#include <boost/any.hpp>
class CBase {};
enum en {Aa = 1, Bb = 2, Cc = 3};
class A {
public:
template<en dim>
struct C : public CBase, boost::static_visitor<CBase *>{
int x;
C() {
x = dim;
}
template <en t>
CBase * operator()(C<t> *s) const {
return s;
}
};

C<Aa>* Aasd;
C<Bb>* Bbsd;
C<Cc>* Ccsd;
std::map<en, boost::variant<C<Bb> *, C<Aa> *, C<Cc> * > > matrices;

A() {
Aasd = new C<Aa>;
Bbsd = new C<Bb>;
Ccsd = new C<Cc>;
matrices.insert(std::make_pair(Bb, Bbsd));
matrices.insert(std::make_pair(Aa, Aasd));
matrices.insert(std::make_pair(Cc, Ccsd));
}

template<en tt>
C<tt>* get() {
return static_cast<C<tt> *>(boost::apply_visitor(C<tt>(), matrices[tt]));
}

~A() {
delete Aasd;
delete Bbsd;
delete Ccsd;
}
};

template<>
A::C<Aa>* A::get<Aa>() {
return static_cast<C<Aa> *>(boost::apply_visitor(C<Aa>(), matrices[Aa]));
}

template<>
A::C<Bb>* A::get<Bb>() {
return static_cast<C<Bb> *>(boost::apply_visitor(C<Bb>(), matrices[Bb]));
}

template<>
A::C<Cc>* A::get<Cc>() {
return static_cast<C<Cc> *>(boost::apply_visitor(C<Cc>(), matrices[Cc]));
}

int main()
{
A a;

int i = 0;
en samp = Aa;
std::cout<<a.get<Aa>()->x<<std::endl; // This runs fine
//std::cout<<a.get<samp>()->x<<std::endl; // This throws error: the value of 'samp' is not usable in a constant expression
return 0;
}

我明白我需要指定一个编译时间常量来实例化一个模板。但是,就我而言,我想使用一个变量来检索其中一个指针。任何关于如何做到这一点的想法或建议将不胜感激。

编辑:

我正在寻找替代建议来检索这 3 个指针 Aasd、Bbsd、Ccsd 的“x”成员,就像在主函数中一样,即使我必须完全删除模板也是如此。大概应该是这样的

en samp = Aa;
a.get(samp)->x = 6;
samp = Bb;
a.get(samp)->x = 5;

en samp = Aa;
a[samp]->x = 6;
samp = Bb;
a[samp]->x = 5;

最佳答案

使 samp 常量:

const en samp;

编辑:为什么它有效:

因为

非类型模板参数必须是常量表达式(在编译时已知)

证明:N3337 14.3.2/1

A template-argument for a non-type, non-template template-parameter shall be one of:

...

  • for a non-type template-parameter of integral or enumeration type, a converted constant expression of the type of the template-parameter; or

...

什么时候是枚举类型变量常量表达式?

N3337 5.19/2:

A conditional-expression is a core constant expression unless it involves one of the following as a potentially evaluated subexpression

...

  • an lvalue-to-rvalue conversion (4.1) unless it is applied to
    • a glvalue of integral or enumeration type that refers to a non-volatile const object with a preceding initialization, initialized with a constant expression, or

...

并且因为在以下情况下:

const en samp = Aasamp指用常量表达式初始化的const对象

关于c++ - 使用变量实例化模板函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37326442/

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