是否有函数可以在模板中调用类名<>而无需自己键入类名?

Is there a function to call the class name in a template<> without typing the name of the class yourself?

提问人:Aboody13 提问时间:7/7/2023 最后编辑:JeJoAboody13 更新时间:7/8/2023 访问量:119

问:

我正在尝试获取类的类型名称。当然,我可以使用,但我需要将其放在这样的模板中typename(class)

ClassA<typeid(class).name()> a = ClassA<typeid(class).name()>(args);

这是我尝试过的:

template<class T>
class A
{
public:
   T t; // the class

   A(T t1)
   {
      t = t1;
   }
};

class B // example class
{
public:
   int i;

   B(int i1)
   {
      i = i1;
   }
};

int main()
{
   B b = B(1);
   A<typeid(b).name()>(b) a = A<typeid(b).name()>(b); // my issue
}

但它总是给我一个错误。

'A': invalid template argument for 'T', type expected.

有什么方法可以解决这个问题(类需要能够接受一个属性中的任何类)?A

C++ 参数-演绎类- 模板 C++17

评论


答:

7赞 JeJo 7/7/2023 #1

有什么方法可以解决这个问题(需要能够接受一个属性中的任何类)?class A

你要找的是 decltype 关键字。你需要

A<decltype(b)> a = A<decltype(b)>{ b };
// or just
auto a = A<decltype(b)>{ b };

但是,从 开始,多亏了 CTAD,它允许您编写。

A a{ b }; // no need of "A<-template-para-list->"

旁注:如果不初始化构造函数初始值设定项列表中的成员,则传入的必须是默认的可构造的。因此,我会推荐TA

template<class T>
class A
{
    T t;
public:   

    A(T t1)
        : t{ t1 } // ---> initialize in constructor initializer list
    {}
};

godbolt.org 现场演示

评论

2赞 MSalters 7/7/2023
旁注是一个很好的观点。它还涵盖了无法将 T 分配给的情况。(例如T= const B)