给出以下类模板:
#include <type_traits>
template< class T, class Unrelated >
struct MyClass
{
static_assert( std::is_same< T, char >::value ||
std::is_same< T, char16_t>::value ||
std::is_same< T, char32_t >::value,
"MyClass only defined for char, char16_t, char32_t" );
MyClass( T init ) {}
MyClass( char32_t init ) {}
// ...
};
第二个(char32_t
)构造函数是T == char
和T == char16_t
的特例。
显然,它会为T == char32_t
生成错误。所以,我想&#34;淘汰&#34;该案例的构造函数。该类相当大,大部分代码都是为所有T
共享的,所以我宁愿不为char32_t
案例专门研究整个类。
我在这里看过enable_if
以及this one这样的相关答案,但无法将任何呈现的解决方案/示例改编为我的特定情况(类模板中的非模板化构造函数) )。
所以我请求你的帮助:
如何使用MyClass( char32_t )
停用MyClass< T, U >
的{{1}}构造函数?
或者,如果这更容易,如何禁用T == char32_t
的{{1}}构造函数? (对于MyClass( T init )
,这两个构造函数在功能上是相同的。)
答案 0 :(得分:4)
我已经看到了enable_if以及此处的相关答案 所以,但无法适应任何提出的解决方案/示例 对于我的具体情况(类模板中的非模板化构造函数)。
您必须使用默认参数使您的构造函数模板化。然后确保enable_if
取决于默认参数。不久:
//void_t trick made a type dependant
template<class T, class ... >
struct always
{
typedef T type;
};
template<class T, class ... D>
using always_t = typename always<T, D...>::type;
template<class T, class Unreleated>
class MyClass
{
public:
// ...
MyClass( T init )
{
}
template<class U = void>
MyClass( std::enable_if_t<
!std::is_same<T, char32_t>::value,
always_t<char32_t, U> //< enable_if expression depends on U
> init)
{
//decltype(init) is always char32_t, but the compiler can not know that
}
};
试试live。
答案 1 :(得分:0)
这不是你要求的解决方案,但它可以解决潜在的问题。
您可以在<script src="https://cdnjs.cloudflare.com/ajax/libs/clipboard.js/1.5.5/clipboard.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="code-snippet">
<pre class="code">
<div>
some code
</div>
</pre>
<input class="copy" type="button" value="copy">
</div>
<div class="code-snippet">
<pre class="code">
<div>
some other code
</div>
</pre>
<input class="copy" type="button" value="copy">
</div>
中实现核心功能,然后定义:
Base<T, Unrelated>