是否可以存储类型名称?

时间:2011-12-12 07:02:19

标签: c++

Functor Disfunction:

在c ++中,有没有办法让模板类的实例知道它的类型?例如,我有一个类functor,碰巧使用两个typename模板参数。一个用于函数的返回类型,一个用于参数类型。我想要一种存储这两种类型的方法,这样我以后就可以轻松地使用仿函数而不需要传递类型。

为什么:

我有一个线程池类,我想将所有这些函子存储在其中,并且我希望能够处理多种类型的函数。所以我认为有必要知道函数的类型,所以我可以稍后调用该函数,同时将它存储在一个不基于模板的类中(当然除了set_function / set_parameter方法)。

2 个答案:

答案 0 :(得分:2)

您可以为模板类型创建typedef,例如:

template <typename T>
class X {
    typedef T value_type;
};

然后可以像这样引用那种类型:

void* p = /* some initialization to an X<int>::value_type */;
X<int>::value_type* x = static_cast<X<int>::value_type*>(p);

答案 1 :(得分:0)

如果我不得不猜测你正在做什么/你想要什么,那就是这样的。 (这是猜测你实际想要什么的信念的完全飞跃,而不是你想要的

class interface {
public: 
  virtual std::unique_ptr<interface> create() const =0; //virtual "constructor" 
  virtual bool is_same_type(const interface* ptr) const =0; //type comparison

  virtual void func() =0; //function
  virtual ~interface() {}
};

template<class T>
class instantiation : public interface
{
public: 
  virtual std::unique_ptr<interface> create() const
  { return std::unique_ptr<interface>(new instantiation()); }
  virtual bool is_same_type(const interface* ptr) const
  { return dynamic_cast<instantiation*>(ptr) != NULL; }

  virtual void func() {}
  virtual ~interface(){}
};

通过这个概念,您可以创建一个容器存储interface,并且他们“记住”它们的类型足以使用相同的模板创建新实例,并比较它们是否具有与另一个相同的模板。

(感谢Xeo将手机短信翻译成适当的C ++)