rit*_*ter 3 c++ templates constructor
这个问题需要了解C++模板元编程,因为它涉及(间接)表达模板.我间接地说,因为它不直接是关于表达模板的问题,而是涉及C++类型的计算.如果您不知道那是什么,请不要回答这个问题.
为了避免在没有足够背景信息的情况下提出问题,让我详细说明我想要解决的一般问题,然后转到更具体的部分.
假设你有一个提供Integers 的库,用户可以像ints 一样进行计算.此外,有可能构建Integer一个int.就像:
Integer<int> i(2);
Run Code Online (Sandbox Code Playgroud)
在我的内部,我的Integer类是一个类模板:
template<class T>
class Integer {
// cut out
};
Run Code Online (Sandbox Code Playgroud)
所以我可以在我喜欢的任何整数类型上定义它.
现在,如果不更改API,我想以一种方式更改库,如果Integer从int它构造它应该由内部表示不同的类型,比如说IntegerLit.这样做的原因是我可以加速一些计算,知道一个实例Integer是从一个创建的int(可以将它作为一个int参数传递给一个函数而不是一个基本指针描述的一般对象+单独的数据.这就像一个评论.)
从a构造时,类型是不同的,int因为我需要编译器根据是否构造而占用不同的代码路径int.我无法使用运行时数据标志执行此操作.(原因很简单:编译器int根据类型生成一个函数,它接受一个或上面提到的更一般类型的对象.)
有了这个说我遇到了一个问题:当使用这样的事情时:
Integer<int> a,b(2);
a = b + b;
Run Code Online (Sandbox Code Playgroud)
这a应该是一般的Integer和b专业的IntegerLit.但是,我的问题是如何在C++中表达这一点,因为用户可以自由地使用相同的类型Integer来定义她的变量.
使类型的多态,即获得IntegerLit来自Integer将无法正常工作.它看起来很好.但是,由于用户创建Integer了无法工作的(基类)实例,因为它是基类,编译器会将其粘贴到表达式树中(这就是问题中涉及表达式模板的原因).因此,两种情况之间不可能有任何区别.在那一点上做RTTI检查动态转换真的不是我想要的.
更有希望似乎是bool lit在类型中添加一个文字模板参数,说明它是否是从一个int或另一个构造的.关键是不要为一个非文字指定转换规则,而是为另一个案例指定转换规则.
但是,我无法让它发挥作用.如果不是从一个构造,下面的代码只编译(GCC 4.7 C++ 11)int.否则它会失败,因为没有指定Integer true作为其值lit.因此编译器会搜索没有转换规则的默认实现.它不是一个改变API并且Integer<int,true>在构造时需要编写的选项int.
template<class T,bool lit=false>
class Integer
{
public:
Integer() {
std::cout << __PRETTY_FUNCTION__ << "\n";
}
T F;
};
template<>
template<class T>
class Integer<T,true>
{
public:
Integer(int i) {
std::cout << __PRETTY_FUNCTION__ << "\n";
}
T F;
};
Run Code Online (Sandbox Code Playgroud)
我开始想知道C++是否可以实现这样的功能.
可能有一个C++ 11的新功能可以帮助吗?
不,这不是C++的工作原理.如果你定义b为Integer b,那么它就是一个Integer.无论后来用于初始化的表达式如何,这都适用b.
另外,请考虑以下事项:extern Integer b;.在其他地方有一个初始化的表达式b,但编译器仍然必须弄清楚这里有什么类型b.(不是"会有",而是"有").