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]
コメントを追加