【发布时间】:2015-07-22 17:10:34
【问题描述】:
我有一个课程模板CFoo<T>。我想允许对CFoo 的其他实例进行隐式强制转换,但仅限于模板参数是T 基类的那些实例。
我尝试使用 SFINAE,但我尝试过的任何编译器(VC 2012 或 gcc)都不起作用:
#include <type_traits>
template <class T> class CFoo {
public:
template <class Q> operator
// typename std::enable_if<std::is_base_of<Q, T>::value, CFoo<Q>&>::type // SHOULD WORK?
// typename std::enable_if<1, CFoo<Q>&>::type // SHOULD WORK?
CFoo<Q>& // compiles, but doesn't restrict on Q like I want
() const {
return *(CFoo<Q>*)this;
}
};
class A {};
class B : public A {};
int main(int argc, char* argv[])
{
CFoo<B> b;
CFoo<A>& a = b;
return 0;
}
为什么在 SFINAE 中被注释掉的任何一个尝试在这里都不起作用?在这两种情况下,我都会收到 a 的无效初始化错误,就好像我的操作员没有被调用一样。
【问题讨论】:
-
上面写满了poof。
-
Q不在推断的上下文中。但是你到底为什么要这样做呢? -
@Captain O. 我不明白!
-
@T.C.好吧,我们有这个自制的智能指针类,以及一个非常大的遗留代码库。我们必须手动向下转换 100,000 个位置。我正在对课程进行大修,并认为我会让它含蓄地沮丧。我不希望它隐含向上。我不认为这是一个坏主意。是吗?
-
我可以看到
operator CFoo<Q>()的用例,尽管使用转换构造函数可能更容易。您目前正在做的事情绝对是个坏主意。 C 风格的演员表是reinterpret_cast加上const_cast,提示,提示...
标签: c++ templates c++11 template-argument-deduction