使用别名模板和继承的显式析构函数调用
Explicit destructor call with an alias template and inheritance
受问题及其答案 Calling destructor with decltype and\or std::remove_reference 的启发,我一直在尝试在我的代码中做同样的事情。不幸的是,下面的 MWE
template<class T>
using alias = T;
class Yo {
public:
~Yo() { }
};
template<class A>
class Lo {
protected:
A a;
};
template<class A>
class Foobar : public Lo<A> {
public:
typedef Lo<A> super;
inline void expl() {
super::a.~alias<decltype(super::a)>();
}
};
int main() {
Foobar<Yo> A;
A.expl();
}
用 g++ 编译很好,但是用 clang 我得到
mwe.cpp:20:27: error: 'alias' following the 'template' keyword
does not refer to a template
有了 icpc,我得到了
mwe.cpp(20): internal error: bad pointer
我不确定这是否是正确的 C++,或者这是否是编译器内部的错误。您看到解决方法了吗?
我找到了让它起作用的方法。但是要这样做,我必须在 Lo class public
中创建变量 a
template<class T>
using alias = T;
class Yo {
public:
~Yo() { }
};
template<class A>
class Lo {
public:
A a;
};
template<class A>
class Foobar : public Lo<A> {
public:
typedef Lo<A> super;
using type = alias<decltype(super::a)>;
inline void expl() {
super::a.~type();
}
};
int main() {
Foobar<Yo> A;
A.expl();
}
编辑我刚刚想到了一些事情
在 Foobar class 你得到一个模板参数 A,它将被传递给超级 class Lo。所以变量 a 具有您在模板中获得的类型!
所以你可以简单地做:
using type = alias<A>;
inline void expl() {
super::a.~type();
}
现在你可以拥有一个受保护的变量a link
受问题及其答案 Calling destructor with decltype and\or std::remove_reference 的启发,我一直在尝试在我的代码中做同样的事情。不幸的是,下面的 MWE
template<class T>
using alias = T;
class Yo {
public:
~Yo() { }
};
template<class A>
class Lo {
protected:
A a;
};
template<class A>
class Foobar : public Lo<A> {
public:
typedef Lo<A> super;
inline void expl() {
super::a.~alias<decltype(super::a)>();
}
};
int main() {
Foobar<Yo> A;
A.expl();
}
用 g++ 编译很好,但是用 clang 我得到
mwe.cpp:20:27: error: 'alias' following the 'template' keyword does not refer to a template
有了 icpc,我得到了
mwe.cpp(20): internal error: bad pointer
我不确定这是否是正确的 C++,或者这是否是编译器内部的错误。您看到解决方法了吗?
我找到了让它起作用的方法。但是要这样做,我必须在 Lo class public
中创建变量 a template<class T>
using alias = T;
class Yo {
public:
~Yo() { }
};
template<class A>
class Lo {
public:
A a;
};
template<class A>
class Foobar : public Lo<A> {
public:
typedef Lo<A> super;
using type = alias<decltype(super::a)>;
inline void expl() {
super::a.~type();
}
};
int main() {
Foobar<Yo> A;
A.expl();
}
编辑我刚刚想到了一些事情
在 Foobar class 你得到一个模板参数 A,它将被传递给超级 class Lo。所以变量 a 具有您在模板中获得的类型! 所以你可以简单地做:
using type = alias<A>;
inline void expl() {
super::a.~type();
}
现在你可以拥有一个受保护的变量a link