Ste*_*phQ 8 c++ boost metaprogramming
我面临以下问题.考虑以下课程:
//Will be similar to bost::reference_wrapper
template<class T>
class Ref {
public:
explicit Ref(T& t) : m_ptr(&t) {}
private:
T* m_ptr;
};
Run Code Online (Sandbox Code Playgroud)
而这个函数返回一个double
double fun() {return 1.0;}
Run Code Online (Sandbox Code Playgroud)
如果我们现在有
double x = 1.0;
const double xc = 1.0;
Ref<double> ref1(x); //OK
Ref<const double> refc1(cx); //OK
Run Code Online (Sandbox Code Playgroud)
不过到目前为止好了:
//Ref<double> ref2( fun() ); //Fails as I want it to
Ref<const double> refc2( fun() ); //Works but I would like it not to
Run Code Online (Sandbox Code Playgroud)
有没有办法修改Ref(你喜欢的方式)而不是函数fun,所以最后一行返回编译时错误?请注意,您可以修改构造函数签名(只要我能够按预期初始化Ref).
您可能不喜欢使用它的语法,但让构造函数采用指针而不是引用。你甚至不能使用一个指向临时变量的常量指针。
至少,不是通过另一个包装器走私它,这有望使代码明显错误(TM):template <typename T> T *reftoptr(T &t) { return &t; }
也就是说,如果您按照reference_wrapper使用的方式使用此方法,您的用户可能实际上想要捕获临时数据。只要 Ref 对象也是与它捕获的临时对象具有相同完整表达式的临时对象,我认为就可以了。例如,
some_algorithm(iterator, anotherit, static_cast<Ref<const double> >(fun()));
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
263 次 |
| 最近记录: |