5

型が const であるか、テンプレート関数を使用していないかを判断したいと思います。

template <typename TTYPE> bool IsConst(TTYPE) {return false;}

template <typename TTYPE> bool IsConst(const TTYPE) {return true;}

しかし、これは機能しません。別の提案はありますか?

4

2 に答える 2

11

あなたが探しているのはstd::is_const. 指定した型が const の場合、valueになりますtrue。そうでない場合は、valueになりますfalse

そのページで見つけることができる例を次に示します。

#include <iostream>
#include <type_traits> //needed for is_const

int main() 
{
    std::cout << boolalpha; //display true/false, not 1/0
    std::cout << std::is_const<int>::value << '\n'; //int isn't const
    std::cout << std::is_const<const int>::value  << '\n'; //const int is const
} 

出力:

false
true

独自のものを作成しようとしたので、将来作成する必要がある場合に備えて、提供されている可能な実装を調べて、これらがどのように機能するかの感触をつかむことをお勧めします. それは良い学習体験です。

于 2012-06-02T13:37:12.087 に答える
1

次のコードを検討してください。

#include <iostream>

template<typename T>
struct isConst
{
    static bool result;
};

template<typename T>
struct isConst<const T>
{
    static bool result;
};

template<typename T>
bool isConst<T>::result = false;

template<typename T>
bool isConst<const T>::result = true;

int main()
{
    std::cout << std::boolalpha;

    std::cout << isConst<int>::result << "\n";
    std::cout << isConst<const int>::result << "\n";
    std::cout << isConst<const char>::result << "\n";
    std::cout << isConst<char*>::result << "\n";
    std::cout << isConst<const float>::result << "\n";

    return 0;
}

テンプレートの専門化であなたの問題を解決します。特殊化された (2 番目の) バージョンが自動的に呼び出されるのはTいつですか。constこのコードをコンパイルして実行すると、次のようになります。

false
true
true
false
true

関数を再定義しているため、バージョンが機能しませんIsConst(禁止されており、コンパイラ エラーが発生します) 。

注:result()静的変数で関数を変更しました。それはまた動作し、より高速です。

于 2012-06-04T12:24:52.810 に答える