可能な解決策は、(あなたがT
は基本的なタイプであることを確認したい場合は、正しいタイプ
template <typename T>
struct myTypeTraits
{ using type = T; };
template <typename T>
struct myTypeTraits<std::complex<T>>
{ using type = T; };
とMyClass
が
template <typename T>
class MyClass
{
using T0 = typename myTypeTraits<T>::type;
T0 var1;
T var2;
};
なっ抽出するために、単純なタイプの特性を定義することができたり算術を意味しますか?)、少し複雑です。
可能な方法は、タイプは次の宣言(なしの一般的な定義)でmyTypeTraits
を変更し、デフォルトのブール値std::complex
template <typename>
struct isComplex : public std::false_type
{ };
template <typename T>
struct isComplex<std::complex<T>> : public std::true_type
{ };
であれば(true
またはfalse
を)言ってタイプの特性を定義しています
template <typename T, bool = std::is_fundamental<T>::value,
bool = isComplex<T>::value>
struct myTypeTraits;
次に2つの専門、ファンダメンタルズのための最初のものとの複合体タイプの第1
template <typename T>
struct myTypeTraits<T, true, false>
{ using type = T; };
template <typename T>
struct myTypeTraits<std::complex<T>, false, true>
{ using type = T; };
MyClass
クラスはstd::string
イコール残っていますが(例で)でそれをインスタンス化しようとすると、今の誤差を与えます。
次は、完全なコンパイルの例
#include <complex>
#include <type_traits>
template <typename>
struct isComplex : public std::false_type
{ };
template <typename T>
struct isComplex<std::complex<T>> : public std::true_type
{ };
template <typename T, bool = std::is_fundamental<T>::value,
bool = isComplex<T>::value>
struct myTypeTraits;
template <typename T>
struct myTypeTraits<T, true, false>
{ using type = T; };
template <typename T>
struct myTypeTraits<std::complex<T>, false, true>
{ using type = T; };
template <typename T>
class MyClass
{
public: // public to check with the static_assert()
using T0 = typename myTypeTraits<T>::type;
private:
T0 var1;
T var2;
};
int main()
{
MyClass<int> mi; // compile
MyClass<std::complex<float>> mc; // compile
// MyClass<std::string> ms; // compilation error
static_assert(std::is_same<int, decltype(mi)::T0>{}, "!");
static_assert(std::is_same<float, decltype(mc)::T0>{}, "!");
}
では部分的な特殊化のための仕事のようですね。 – Quentin
[基本型のテンプレート特殊化](https://stackoverflow.com/questions/45244809/template-specialization-for-fundamental-types)の可能な複製 –
算術演算でも 'std :: complex'でもない場合はどうなりますか? – AndyG