テンプレートパラメータがstd::complex
かどうかを確認するにはどうすればよいですか? float、double、intなどのすべてのデータ型をサポートする一般的なメソッドが必要です。 私はstd :: is_sameを使って知っています。特定の型を具体的に調べることができます。例えば、std::complex<float>
です。 しかし、ここで私は一般的な方法が必要です。テンプレート引数がstd :: complexであるかどうかを確認する方法?
3
A
答えて
2
私はあなたの質問を理解しているので、与えられたタイプが特定のテンプレートテンプレートタイプの特殊化であるかどうかをテストする一般的な方法の実装を探しています。これは、Frank's answerのようなクラステンプレートを使用して行うことができます。
#include <type_traits>
#include <complex>
#include <iostream>
template <template <class...> class TT, class... Args>
std::true_type is_tt_impl(TT<Args...>);
template <template <class...> class TT>
std::false_type is_tt_impl(...);
template <template <class...> class TT, class T>
using is_tt = decltype(is_tt_impl<TT>(std::declval<typename std::decay<T>::type>()));
int main() {
static_assert(is_tt<std::complex, std::complex<int>>::value, "!");
static_assert(is_tt<std::complex, std::complex<float>>::value, "!");
static_assert(!is_tt<std::complex, float>::value, "!");
}
次のように、形質を利用することができます:
#include <type_traits>
#include <complex>
#include <iostream>
//complementary approach to specialization one would be to use function overloading
template <template <class...> class TT, class... Args>
std::true_type is_tt_impl(TT<Args...>);
template <template <class...> class TT>
std::false_type is_tt_impl(...);
template <template <class...> class TT, class T>
using is_tt = decltype(is_tt_impl<TT>(std::declval<typename std::decay<T>::type>()));
template <class T>
typename std::enable_if<is_tt<std::complex, T>::value>::type print(T t) {
std::cout << "(" << t.real() << "," << t.imag() << ")" << std::endl;
}
template <class T>
typename std::enable_if<!is_tt<std::complex, T>::value>::type print(T t) {
std::cout << t << std::endl;
}
int main() {
print(std::complex<int>(1, 2));
print(std::complex<double>(1.5, 2.5));
print(5.5);
}
(1,2)関数のオーバーロードをテンプレート型の別名 - 私はあなたの分業と相補的なアプローチを紹介します
(1.5,2.5)
5.5
8
これは、部分テンプレートの特殊化を使用して行うことができます。
まずあなたがそのデフォルト値をfalseにキャッチオールのテンプレートを定義します。
template<typename T>
struct is_complex_t<std::complex<T>> : public std::true_type {};
は、私はまた、ユーティリティを追加したい:
template<typename T>
struct is_complex_t : public std::false_type {};
次に、あなたがあなたの条件に一致するタイプのために過負荷を提供します機能:同様に、
template<typename T>
constexpr bool is_complex() { return is_complex_t<T>::value; }
編集:このユーティリティ機能は必要ないC++ 14以降では、std :: integral_typeはoperator()を実装しています。
使用法:
bool int_is_complex = is_complex<int>(); //false
bool complex_is_complex = is_complex<std::complex<float>>(); //true
3
あなたがタグ派遣法上のあなたのソリューションをベースにすることができます。それは、最小限、実施例以下の
:ここ
#include<complex>
#include<utility>
#include<iostream>
class C {
template<typename T>
void f(int, std::complex<T>) {
std::cout << "complex" << std::endl;
}
template<typename T>
void f(char, T &&t) {
std::cout << "something else" << std::endl;
}
public:
template<typename T>
void f(T &&t) {
f(0, std::forward<T>(t));
}
};
int main() {
C c;
c.f(0);
c.f(std::complex<float>{});
}
を、あなたは右の関数に内部的にほとんどすべてと派遣を受け入れる一般的な方法f
を持っています。
関連する問題
- 1. テンプレート引数が参照かどうかの確認[C++ 03]
- 2. 引数が数値かどうかを確認する
- 3. ブックマークがあるかどうかを確認する方法
- 4. 応答があるかどうかを確認する方法
- 5. テンプレートの引数を確認する
- 6. move_uploaded_file関数にエラーがあるかどうかを確認する方法
- 7. 文字が整数かどうかを確認する方法
- 8. 値が数値かどうかを確認する方法
- 9. req.paramsが数値かどうかを確認する方法は?
- 10. テンプレートでフォームフィールドが空であるかどうかを確認します
- 11. アンドロイドで電話がミュートであるかどうかを確認する方法
- 12. EFでオブジェクトがnullであるかどうかを確認する方法
- 13. C++変数がstd :: string型であるかどうかをチェックする方法?
- 14. 文字列が正の整数であるかどうかを確認する方法はありますか?
- 15. xmlノードがasp.netのルートであるかどうかを確認する方法
- 16. UITextFieldがfirstResponderであるかどうかを確認する方法
- 17. MongoEngine - クエリ - ListFieldが空であるかどうかを確認する方法
- 18. 入力がCであるかどうかを確認する方法は?
- 19. ASP.NET - ユーザーがモバイルユーザーであるかどうかを確認する方法
- 20. blobstoreファイルが可読であるかどうかを確認する方法
- 21. phpmailerフィールドが空であるかどうかを確認する方法sintax
- 22. ボックス内の値が空であるかどうかを確認する方法
- 23. Meteorのユーザーアカウントが空であるかどうかを確認する方法?
- 24. ドメイン名がPHPのCNAMEであるかどうかを確認する方法
- 25. 3gがアクティブであるかどうかを確認する方法
- 26. IPがパブリックプロキシであるかどうかを確認する方法
- 27. マシンがチューリングマシンであるかどうかを確認する方法
- 28. Ruby DBI - レコードセットが空であるかどうかを確認する方法
- 29. intergerが空であるかどうかを確認する方法
- 30. レコードセットの行が空であるかどうかを確認する方法?
テンプレートの特殊化 – Danh
「専門化する」とは何ですか?具体的な例を追加すると、あなたの投稿には答えが出るほどの情報がありません。 – Holt