5

私はこのようなコードを持っています

template <typename T> void fun (T value)
{
    .....
    value.print ();  //Here if T is a class I want to call print (), 
                     //otherwise use printf
    .....
}

ここで、値を出力するには、T がクラスの場合はオブジェクトの print 関数を呼び出したいのですが、T が基本データ型の場合は printf を使用したいだけです。

では、Template 型が基本データ型かクラスかを確認するにはどうすればよいでしょうか?

4

4 に答える 4

6

std::is_class(そしておそらく)を使用できますstd::is_union。詳細は、「基本型」の定義によって異なります。型サポートの詳細については、こちらを参照してください

ただし、C++ では通常、std::ostream& operator<<(std::ostream&, T)ユーザー定義型を出力するためにオーバーロードすることに注意してくださいT。このように、関数テンプレートに渡される型がクラスであるかどうかについて心配する必要はありません。

template <typename T> void fun (T value)
{
    std::cout << value << "\n";
}
于 2013-04-21T14:24:50.590 に答える
3

を使用する代わりにoperator<<(std::ostream&)、任意の型のオーバーロードをお勧めします。使用する書式指定子をどのように知ることができますか?Tprintf()

template <typename T> void fun (T value)
{
    .....
    std::cout << value <<  std::endl;
    .....
}

FWIW、std::is_class存在します。

于 2013-04-21T14:25:11.380 に答える
2

印刷ヘルパー関数のテンプレート/オーバーロードを使用します。

template <typename T>
void print(T const & t) { t.print(); }

template <typename U>
void print(U * p) { std::printf("%p", static_cast<void*>(p)); }
// we really an enable_if on is_object<U>::value here...

void print(char x) { std::printf("%c", x); }
void print(int x) { std::printf("%d", x); }

// etc. for all fundamental types

次に、コードで簡単に言うことができprint(value);ます。

于 2013-04-21T14:30:53.473 に答える
2

C++11 をサポートしていない場合の代替手段。

template<typename T>
class isClassT {
private:
    typedef char One;
    typedef struct { char a[2]; } Two;
    template<typename C> static One test(int C::*);
    template<typename C> static Two test(…);
public:
    enum { Yes = sizeof(isClassT<T>::test<T>(0)) == 1 };
    enum { No = !Yes };
};

型がクラス型かどうかを調べるための単純なテンプレート。詳細はC++ テンプレートの完全なガイド を参照してください。

if (isClassT<T>::Yes) {
    std::cout << " Type is class " << std::endl;
}
于 2013-04-21T14:26:57.367 に答える