予測できない型エイリアスが存在する場合に、明示的なテンプレートのインスタンス化にアプローチするにはどうすればよいですか?

軌道上での明度レース

extern templateビルド時間を短縮し、ビルド中のディスクのフットプリントを削減するために、プロジェクトにいくつかを追加しようとしています。

私は頻繁に使用する専門分野をリストすることによってそうしました、例えば

extern template class std::vector<std::string>;
extern template class std::vector<unsigned int>;
extern template class std::vector<uint32_t>;
extern template class std::vector<size_t>;

問題はそれでunsigned int ある size_tかもしれない、とuint32_t ある unsigned intかもしれません、。したがって、ビルドターゲットによっては、externスペシャライゼーションを実際にインスタンス化する「非」種類のリストのコンパイルが失敗します。

template class std::vector<std::string>;
template class std::vector<unsigned int>;
template class std::vector<uint32_t>;
template class std::vector<size_t>;

エラーは次のようになります(行番号と列番号が不正確です)

templates-impl.h:15:36: error: duplicate explicit instantiation of ‘class std::vector<long unsigned int>’ [-fpermissive]
 template class std::vector<size_t>;

私の目標は、使用するタイプを、使用するときに、最小限の手間で、さまざまなターゲットのリストのバリアントをハードコーディングする必要なしにリストできるようにすることです。

C ++ 14では、少なくとも名前空間スコープで許可されていればif constexprといくつかstd::is_sameこれを解決できると思います。

C ++ 11でそれを行うにはどうすればよいですか?

マッシミリアーノジェーンズ

あるいは、インスタンス化されるタイプのタイプリストがあり、その繰り返しタイプのみがダミータイプに置き換えられている場合があります(リンク時に最適化されることを願っています)。

C ++ 11では、次のようになります。

template<typename... V>
struct explicit_instlist
{
    template<int I>
    struct get
    {
        using VI = typename std::tuple_element<I,std::tuple<V...>>::type;

        using type = typename std::conditional< is_first_at<I,VI,V...>::value,
            VI, dummy_inst<I,VI> >::type;
    };
};

template<unsigned I>
using my_list = typename explicit_instlist<
    std::string,
    unsigned int,
    uint32_t,
    size_t
    >::template get<I>::type;

/*extern*/ template class std::vector< my_list<0> >;
/*extern*/ template class std::vector< my_list<1> >;
/*extern*/ template class std::vector< my_list<2> >;
/*extern*/ template class std::vector< my_list<3> >;

ここでdummy_inst<I,T>、すでに使用されている場合にTの代わりに使用される一意のダミータイプを生成し、次のis_first_atように機能します。

template<int I,typename T>
struct dummy_inst {};

template<int I,typename T,typename... V>
struct is_first_at {};

template<int I,typename T,typename V,typename... Vs>
struct is_first_at<I,T,V,Vs...>: std::conditional< std::is_same<T,V>::value,
    std::integral_constant<bool,I==0>,
    is_first_at<I-1,T,Vs...> >::type {};

明らかに、明示的にdummy_instインスタンス化されるテンプレートが空のデフォルトをサポートしていない場合は、特殊化する必要があります。ブーストプリプロセッサのようなものを使用して、明示的なインスタンス化を明示的に「反復」することを回避し、型リストを直接受け入れるマクロを作成することができます...

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

Related 関連記事

ホットタグ

アーカイブ