2017-10-08 12 views
0

テンプレートクラスポインタを使用してテンプレート関数を宣言できますか?このようなもの:C++ 11/14/17:テンプレートパラメータとしてのテンプレートクラスポインタ

template <typename FirstType, typename ... TypesRemaining> 
class MyClass 
{ 
    // ... 
}; 

template <int n, template <typename FirstType, typename ... TypesRemaining> typename MyClass<FirstType, TypesRemaining...>::*ptr> myFunction() { 
    // ... 
} 

ポインタタイプを宣言するには 'using'を使用できますか?このような何か:

template <typename FirstType, typename ... TypesRemaining> 
class MyClass 
{ 
    // ... 
}; 

template<typename FirstType, typename ... TypesRemaining> 
using ptrMyClass = MyClass<FirstType, TypesRemaining...>*; 

template <int n, template <typename FirstType, typename ... TypesRemaining> typename ptrMyClass<FirstType, TypesRemaining...> ptr> myFunction() { 
    // ... 
} 
+0

あなたがしようとしている場合、問題は何をこの? – user0042

+0

上記のコードはすべてコンパイルされません。私はこれに相当する何かを達成するための正しい構文をどうやって行うのか理解できません。 – Aesope

答えて

1

あなたはこのようなものは、(打ち鳴らすと罰金コンパイルし、GCCとICEいます)を行うことができます。

template <typename FirstType, typename... TypesRemaining> 
class MyClass 
{ 
    // ... 
}; 

template<int n, auto ptr> class 
myFunction_impl; 

template 
< 
    int n 
, typename FirstType 
, typename... TypesRemaining 
, MyClass<FirstType, TypesRemaining...> * ptr 
> class 
myFunction_impl<n, ptr> 
{ 
    public: static void 
    impl(void) 
    { 
     // ... 
    } 
}; 

template<int n, auto ptr> auto 
myFunction(void) 
{ 
    return(myFunction_impl<n, ptr>::impl()); 
} 

int main() 
{ 
    myFunction<0, static_cast<MyClass<int, int, int> *>(nullptr)>(); 
    return 0; 
} 

Online compiler link

+0

この回答に感謝します。私はVisual Studio(少なくとも2017)に悩まされていると言わなかった。あなたのコードをコンパイルしようとしましたが、VSで動作しません。テンプレート宣言が "認識できないテンプレート宣言/定義"であるというmyFunction_implクラスのメッセージが表示されます(パラメータパックが最後にないと思われます)。また、あなたのソリューションをよりよく理解したいと思います。なぜあなたは実装のために中間クラスを持つ必要がありますか?あなたの時間をもう一度ありがとう。 – Aesope

+0

残念ながら、VSはまだ最新の標準に対する適切なサポートを持っていません。中級クラスの実装では、関数では不可能な 'FirstType'と' TypesRemaining'を推測する部分的な特殊化を定義することができます。あなたが本当にそれらを必要としない場合、中間クラスは必要ありません。 – VTT

関連する問題