簡體   English   中英

防止模板類的所有實例化-包括受支持的類型

[英]Prevent all instantiations of a template class - including supported types

如果我有模板類MyClass<T>並且如果我顯式實例化了intfloat (在cpp文件中),則可以使用extern template class MyClass<int>extern template class MyClass<float>來防止遇到任何編譯單元此類從不必要的實例化為intfloat 當然,對於任何其他類型,該類仍將實例化。

現在,我有一個類MyClass2<T> ,它僅適用於intfloatchardoubleshort和它們的無符號變體。 由於我事先知道所有類型,因此此類中所有方法的定義都在cpp文件中。 這也是我為上述所有類型顯式實例化MyClass2<T>的地方。 在標題中,我有static_assert防止用戶使用不受支持的類型創建MyClass2<T>

有什么方法可以完全阻止MyClass2<T>實例化所有類型( 包括支持的類型 )(例如, extern template class MyClass2;盡管我知道這不起作用)? 所有 extern template 我想避免為所有受支持的類型鍵入extern template class MyClass2<int>

考慮到我已經為這些類型顯式實例化了該類,這似乎不僅是多余的,而且對於大型項目(如我正在研究的項目)而言,每次添加新類型時我都需要維護的另外幾行。

您可以使用SFINAE如下所示

template<typename T>
using value_type =  typename std::enable_if<
                    std::is_same<float, T>::value ||
                    std::is_same<double, T>::value
                    //...other supported types goes here
                   >::type  ;



template<class T, class Enable = void>
class  MyClass2 ;

template<class T>
class MyClass2<T, value_type<T> > 
{
};

 MyClass2<float> t;
 MyClass2<int> t1; // Error !

Here

老實說,這聽起來像是宏的工作:

// explicit_instantiations.h
#ifndef PERFORM_INSTANTIANTION
#define EXTERNALLY_INSTANTIATED extern
#else
#define EXTERNALLY_INSTANTIATED
#endif

EXTERNALLY_INSTANTIATED template class MyClass<int>;
EXTERNALLY_INSTANTIATED template class MyClass<float>;
// etc.

// header
#include "explicit_instantiations.h"

// cpp file
#define PERFORM_INSTANTIATION
#include "explicit_instantiations.h"

關於什么:

template <typename T>
struct Base {};

template <typename T> 
struct Supported;

template <> 
struct Supported<int> : public Base<int>
{};

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM