根据类模板参数

时间:2016-01-30 13:42:04

标签: c++ templates c++11

给出以下类模板:

#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 == charT == 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 ),这两个构造函数在功能上是相同的。)

2 个答案:

答案 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"> &lt;div&gt; some code &lt;/div&gt; </pre> <input class="copy" type="button" value="copy"> </div> <div class="code-snippet"> <pre class="code"> &lt;div&gt; some other code &lt;/div&gt; </pre> <input class="copy" type="button" value="copy"> </div>中实现核心功能,然后定义:

Base<T, Unrelated>