使用变量实例化模板化函数
Instantiating the templated function using variables
我在一个类中有三个指针,每个指针都是模板化结构的实例化。我正在尝试使用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
非类型、非模板的模板参数应为:之一
- 对于整型的非类型模板参数或枚举类型的,模板参数类型的已转换常量表达式;或
什么时候是枚举型变量常量表达式?
N3337 5.19/2:
条件表达式是核心常量表达式,除非它涉及以下之一作为潜在的评估的子表达式
- 左值到右值的转换(4.1),除非它应用于
- integral或枚举类型的glvalue,引用前面带有的非易失性常量对象初始化,用常量表达式初始化的,或
并且因为在以下情况下:
const en samp = Aa
,samp
是指用常量表达式初始化的常量对象
将x
移到CBase
中,然后从get
返回CBase *
而不是C<T> *
。这将至少解决返回值的问题,允许调用代码轻松访问->x
。
然后你可以有一个简单的方法,比如这样(未经测试):
CBase* A::get(en x) {
switch(x) {
break; case Aa: return this->get<Aa>();
break; case Bb: return this->get<Bb>();
break; case Cc: return this->get<Cc>();
}
}
相关文章:
- 如何使用非默认构造函数实例化模板化类
- C++ - 使用另一个类的构造函数实例化一个对象
- 与参数匹配的友元模板函数实例化
- 在保证复制的世界中构造函数实例化
- SFINAE 和模板函数实例化:为什么在启用了 SFINAE 类型的函数参数中使用模板参数时无法推断模板参数?
- 防止复制构造函数实例化 C++11 类"deleting"
- 如何键入定义一个专门的 std::set 模板,使用特定的比较函数实例化
- 使用不同类型的模板函数实例化
- C 调用模板构造函数实例化
- 为什么很清楚模板函数实例化不会内联
- 模板函数实例化文件
- 模板函数实例化的可移植性问题
- 模板函数实例化 自定义数据类型的问题
- 模板类成员函数实例化
- C++.对象使用错误的构造函数实例化
- C++如何用参数化构造函数实例化对象
- 为什么无法使用复制构造函数实例化"non const"而可以在没有复制构造函数的情况下实例化配对?
- 双模板化函数实例化失败
- 延迟 crtp 基类中的成员函数实例化
- 如何根据容器的元素类型启用模板函数实例化