型が const であるか、テンプレート関数を使用していないかを判断したいと思います。
template <typename TTYPE> bool IsConst(TTYPE) {return false;}
template <typename TTYPE> bool IsConst(const TTYPE) {return true;}
しかし、これは機能しません。別の提案はありますか?
あなたが探しているのは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
独自のものを作成しようとしたので、将来作成する必要がある場合に備えて、提供されている可能な実装を調べて、これらがどのように機能するかの感触をつかむことをお勧めします. それは良い学習体験です。
次のコードを検討してください。
#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()
静的変数で関数を変更しました。それはまた動作し、より高速です。