2

できるようになりたいこと...

型パラメーターとして渡されたオブジェクトの型に基づいて (名前付き) 共有メモリ プールを設定するテンプレート クラスがあります。おそらくプリプロセッサ演算子などを使用して、型名を「文字列化」し、識別子を追加する方法があるかどうか疑問に思っていましたか?

構文の行に沿ったもの: <classtype>_identifier
どこMyClass<int>で生成されるint_identifierか ...
例:

template<typename T>
class MyClass
{
private:
    #define TYPENAME_STRING(s) T_#s
    std::string m_typeName;

public:
    MyClass(std::string objName = "ObjectName")
    {
        // This:
        m_typeName = TYPENAME_STRING(objName.c_str());
        // ...Obviously doesn't work, since this is the equivalent of typing:
        m_typeName = "T_ObjectName";
        // ...When what we really want is something like:
        m_typeName = "int_ObjectName";
    }
    ~MyClass();        
};


これを機能させると、型パラメーターとして渡されるオブジェクトの型に完全に基づいて、疑似一意メモリ プールの名前付け、作成、および管理を行うのに役立ちます。

このようなことは可能ですか?

また、この型名を解決し、「文字列化」せずに識別子の先頭に追加することはできますか (つまり、という名前 の typedef を作成しますintObjectName)?

4

3 に答える 3

6

いいえ、少なくともそのレベルでは不可能です。マクロは、コンパイル前、つまりT、例のようなテンプレート型パラメーターが評価される前に評価されます。ただし、できることは次のようなものです。

#include <string>
#include <memory>
template <class T> struct TInfo;
template <class T> class MyClass;

#define TINFO(type)                                \
template <> struct TInfo<type> {                   \
  static char const* getName() {                   \
    return #type;                                  \
  }                                                \
};                                                 \
typedef MyClass<type> type##_Class;                \
typedef std::unique_ptr<MyClass<type>> type##_UPtr; 


template <class T>
class MyClass {
private:
  std::string m_typeName;

public:
  MyClass(std::string objName = "ObjectName") 
    : m_typeName(std::string(TInfo<T>::getName()) + "_" + objName)
  {}

  std::string const& getName() {
    return m_typeName;
  }
};


//usage:
#include <iostream>

TINFO(int);
int main()
{
  int_UPtr pi(new int_Class());
  std::cout << pi->getName() << '\n';
}

http://ideone.com/3ivyqvを参照

于 2013-05-15T10:43:53.757 に答える
3

これを使用して、型を文字列化できます。

template <typename T>
class MyClass {
public:
    static const char *name; // Not private
// ...
};

#define DECLARE_MY_CLASS(x) template<> const char *MyClass<x>::name = #x;

DECLARE_MY_CLASS(int);

ただし、使用するDECLARE_MY_CLASSすべてのタイプが必要です。

于 2013-05-15T10:52:11.677 に答える