2017-12-15 17 views
5

私は入力ポートと言うようにテンプレートを作成したいと思っています。これは、単一の入出力ポート、または入力ピンのリストから行うことができます。私はそれらのテンプレートが同じ名前を持つことを好む。私は、入出力ポートと入力ピンの両方の概念を持っています。私は書くことができますC++テンプレートは、1つのタイプのリスト、または他の1つのタイプのリストと照合できますか?

template< typename... arguments > 
struct port_in .... 

template< pin_in T > 
struct port_in<> .... 

しかし、今リストのバージョンはどのような種類を受け入れます。私は実装でそれを確認することができますが、それは適切ではない型を渡すときにユーザーが得るエラーメッセージを低下させます。どういうわけかリストを1つのタイプに制限できますが、もう1つのタイプの単一のテンプレートパラメータを許可できますか?

答えて

4

ユーザーが常に合理的なエラーメッセージが出ていることを確認したい場合は、基本テンプレートを制約する必要があります。既存の概念がInputPinInputOutputPort命名されていると仮定すると、あなたは次のように入力ピンの配列、または単一の入力/出力ポートのいずれかを受け入れるようにベーステンプレートを制約することができます:

template<class... Ts> 
concept bool AllInputPins = (InputPin<Ts> && ...); 

template<class... Ts> 
concept bool OneInputOutputPort = sizeof...(Ts) == 1 && (InputOutputPort<Ts> && ...); 

template <class... Args> 
    requires AllInputPins<Args...> || OneInputOutputPort<Args...> 
struct port_in { 
    // ... 
}; 
+0

これはよく見えます。私は明日それを試してみるよ。私が欠けていたのは、コンセプトがリストを受け入れる能力でした。 –

+0

'concept'は非標準です。 – SergeyA

+0

はい、私はコンセプトを使用しています(この質問には「C++コンセプト」というタグが付いています)。質問文にコンセプトについて言及します。 –

1

リストバージョンは、あなたがそれを作ることができるの数字を取ることになっている場合:

template<uint16_t ... Ports> 
struct port_in .... 

私はそれが非整数を取ることができれば、これを行うにはきれいな方法があるかわからないし、あなたが実際にしたいです(すべての引数が同じ型である必要はありません)。あなたはすべてのタイプが同じである必要ができれば私はあなたのような何かを行うことができ思う:

template<typename T, std::enable_if_t<T> * = nullptr> 
struct port_in_base{}; 
template<typename T, T ... ports> 
struct port_in : port_in_base<T> .... 
+0

は '私はきれいがあるかわかりません非整数を取ることができ、実際の型リストの標準的な方法が 'std :: integral_constant'またはそれと同等のものを渡すことが必要な場合、これを行う方法は... –

+0

テンプレートパラメータはすべてのクラスであり、整数ではありません。 –

関連する問題