C++ 模板类型名问题

C++ 模板类型名问题,c++,templates,C++,Templates,我有一个模板的问题,想知道是否有一个可能的方式来实现我想做的事情。这是我的问题 template <typename T> class A { public: typedef T* pointer; typedef const pointer const_pointer; A() {} template <typename D> A(const D& d) {

我有一个模板的问题,想知道是否有一个可能的方式来实现我想做的事情。这是我的问题

template <typename T>
class A
{
public:

    typedef T*              pointer;
    typedef const pointer   const_pointer;

    A()
    {}

    template <typename D>
    A(const D& d)
    {
        // how can I store the D type 
        // so I can refer it later on
        // outside of this function
    }
};
模板
甲级
{
公众:
typedef T*指针;
类型定义常量指针常量指针;
()
{}
模板
A(土木工程设计及发展)
{
//如何存储D类型
//所以我以后可以参考
//在这个功能之外
}
};
好的,这是我想做的更完整的代码(可能无法编译)

C类
{
公众:
虚拟~C(){}
虚空*get_d()=0;
私人:
};
模板
Cimpl类:公共C
{
公众:
Cimpl()
:t()
,d()
{}
Cimpl(持续T&T、持续D&D)
:t(t)
,(d)
{}
void*get_d()
{
返回并重新解释铸件(d);
}
私人:
T;
D;
};
B类
{
公众:
B()
:p(0)
{}
模板
B(持续T&T、持续D&D)
:p(0)
{    
尝试
{
p=新的Cimpl(t,d);
}
捕获(…)
{
d(p);
}
}
void*get_d()
{
返回(p!=0)?p->get_d():0;
}
~B()
{
删除p;
}
私人:
C*p;
};
模板
甲级
{
结构示例
{
};
公众:
typedef T*指针;
类型定义常量指针常量指针;
()
{}
模板
A(康斯特T&T)
:b(t,示例d())
{
}
模板
A(持续T&T、持续D&D)
:b(t,d)
{
//如何存储D类型
//所以我以后可以参考
//在这个功能之外
}
//不是类型安全的…因为用户可以强制转换为任何类型
//如果我可以在上一页中存储类型user pass
//然后我可以用回去
模板
T*get_d()
{
重新解释演员阵容(b.get_d());
}
私人:
B B;
};
所以我可以像这样使用这个类

1)A<int> a(1);// with example_d as D
2)A<int> b(1, another_d()) // with another_d
1)A(1);//以d为例
2) A b(1,另一个d())//与另一个d
我可以将模板更改为采用2个参数,并将第2种类型的默认参数用作示例。所以我可以做到1)但不能做到2)。因为我必须这样编码

A<int, another_d> b(1, another_d()); 
ab(1,另一个d());

键入有点太长…

无法存储类型,只能存储对象

(如果要存储传递给
A
的构造函数的参数
d
,请查看。)

您不能像这样“保存”类型名。您真正想要做的是使类型D成为类的模板参数之一,例如

template <typename T, typename D>
class A
{
public:

    typedef T*              pointer;
    typedef const pointer   const_pointer;

    A()
    {}

    A(const D& d)
    {
    }
};

如果要在类A的其他成员函数中使用类型D,可以将D设为类A的第二个模板参数。

这看起来像是要创建一个包含成员变量的模板类。你应该把这看作是一种可行的方法

基本上,
boost::any
可以接受任何值类型。如果以后知道该类型,则可以安全地检索该类型。关于如何使用它的一个很好的例子是在映射中存储不同的数据类型(稍后通过名称检索any时,您知道该类型)


如果这不是您想要的,那么使用一个巧妙的技巧来实现它,它可能会帮助您实现您想要做的事情。

您不能存储类型本身,但有一些变通方法。你想对D做什么?参数“T”有什么意义?这和这个问题有什么关系?我没有澄清我到底想做什么。我希望一个类只接受一个模板参数。然后,另一个模板类型随参数构造函数一起提供。我可以在类的其他部分使用D类型,而不仅仅是类型D传入的地方,而不仅仅是我选择的随机参数名。没关系。检查我上面的评论和更新,现在你的情况是更不可能的。您不仅希望“存储”类型(您不能这样做),还希望将参数传递给类的构造函数以修改其成员之一的返回类型。这个问题唯一合理的答案是多个类模板参数或子类化。实际上我知道这一点,但我只需要一个类模板参数。所以我想知道有没有办法。谢谢你有什么理由绝对不能有两个模板参数吗?如果是这种情况,您可以从另一个类Abase派生A,该类将D作为其模板参数。@stephenteh:您能告诉我们您要存储
D
的目的吗?通常您不想将
D
作为模板参数,因为您希望参数推断生效,这样您就不必详细说明了。
template <typename T, typename D>
class A
{
public:

    typedef T*              pointer;
    typedef const pointer   const_pointer;

    A()
    {}

    A(const D& d)
    {
    }
};
template <typename T>
class ABase
{
public:

    typedef T*              pointer;
    typedef const pointer   const_pointer;

    ABase()
    {}

protected:

    /* You might want to omit this constructor completely, 
     * depending on your use case */

    template<typename D>
    ABase(const D& d)
    {
    }
};

template <typename T, typename D>
class A : public ABase<T>
{
public:

    A()
    {}

    A(const D& d)
      : ABase(d)
    {
    }
};