![](/img/trans.png)
[英]Prevent instantiation of template class for types not supported by stringstream extraction operator (>>)
[英]Prevent all instantiations of a template class - including supported types
如果我有模板類MyClass<T>
並且如果我顯式實例化了int
和float
(在cpp
文件中),則可以使用extern template class MyClass<int>
和extern template class MyClass<float>
來防止遇到任何編譯單元此類從不必要的實例化為int
和float
。 當然,對於任何其他類型,該類仍將實例化。
現在,我有一個類MyClass2<T>
,它僅適用於int
, float
, char
, double
, short
和它們的無符號變體。 由於我事先知道所有類型,因此此類中所有方法的定義都在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.