【发布时间】:2020-03-04 11:13:21
【问题描述】:
有没有办法在编译时隐式引用类名?
具体来说,如果我想在class B 的范围内使用class B 声明template class A 的实例,有没有办法避免在声明class A 的语法中显式引用“B”实例?
用一个例子更好地说明:
// main.cpp
#include <iostream>
using namespace std;
template <typename T>
class A
{
public:
typedef void (T::*TFunc)();
A( T& t ) : t_( t ) {}
void callFunc( TFunc tFunc ) { (t_.*tFunc)(); }
private:
T& t_;
};
class LongClassName
{
public:
LongClassName() : a_( *this ) {}
void pubFunc()
{
a_.callFunc( &LongClassName::privFunc ); // Can I avoid explicitly using "LongClassName" here?
}
private:
void privFunc() { cout << __PRETTY_FUNCTION__ << endl; }
A<LongClassName> a_; // Can I avoid explicitly using "LongClassName" here?
};
int main( int argc, char* argv[] )
{
LongClassName().pubFunc();
return 0;
}
我尝试过的:
阅读Is there a __CLASS__ macro in C++?,所以我知道没有__CLASS__(伪等效于__FUNCTION__)预处理宏。该帖子的一些解决方案从__PRETTY_FUNCTION__ 中提取类名 - 但这是不适用于这种情况的运行时解决方案。
我在 StackOverflow 上阅读了 conflicting information 关于 typeid(T) 是运行时还是编译时;无论哪种方式,A<typeid(*this).name()> a_; 都无法编译,而且无论如何看起来都是错误的:在那种情况下显然没有 this。
根据我的阅读,https://en.cppreference.com/w/cpp/language/typeid 处的文字清楚地表明typeid 是运行时的,因此不适用于这种情况。
【问题讨论】:
-
您是否担心输入过多,或者您是否正在尝试解决真正的问题?
-
@foreknownas_463035818 - 学术好奇心:能够隐式引用类名似乎“不错”/代码危害较小。
-
您可以使用
decltype(*this),因为它在编译时运行,但正如您所说,在这种情况下没有this -
decltype()可能更像您需要的,而不是typeid()。
标签: c++ templates class-names