1

我想知道是否可以使用 SFINAE 在不同的类中设置别名模板,具体取决于特征类中是否存在别名。

template<class T>
struct Foo_Traits;

struct Foo1;

template<>
struct Foo_Traits<Foo1>
{
  using type1 = Bar1;
  using type2 = Bar2;
};

struct Foo2;

template<>
struct Foo_Traits <Foo2>
{
  using type1 = Bar3;
};

本质上,我们有 2 个类 Foo1 和 Foo2 以及它们的特征类,在这种情况下定义类型别名以简化它。在所有情况下,我们将拥有 type1 别名,在某些情况下,我们将拥有 type2。

在另一个类中(在我的情况下,它实际上是 Foo 的基类)我想为这些类型设置别名。

template<typename ImplT>
class FooBase
{
   using T1 = typename Foo_Traits<ImplT>::type1;

   using T2 = typename std::conditional< defined<typename Foo_Traits<ImplT>::type1>::value , 
                                         typename Foo_Traits<ImplT>::type2,
                                         T1>::type; 
};

我怎样才能真正实现用伪代码编写的那种东西

 using T2 = etc...
4

1 回答 1

3

您的答案可以在建议的N3911void_t中找到。

鉴于:

template <typename...>
using void_t = void;

你可以这样写你的has_type2_member谓词:

template <typename, typename = void>
struct has_type2_member : std::false_type {};

template <typename T>
struct has_type2_member<T, void_t<typename T::type2>> : std::true_type {};

我们不能直接使用这个谓词,但我们可以根据需要对其进行修改。

template <typename ImplT>
class FooBase
{
  using T1 = typename Foo_Traits<ImplT>::type1;

  template <typename, typename = void>
  struct type2_or_type1 {
    using type = T1;
  };

  template <typename T>
  struct type2_or_type1<T, void_t<typename T::type2>> {
    using type = typename T::type2;
  };

  using T2 = typename type2_or_type1<Foo_Traits<ImplT>>::type;
};
于 2015-03-07T08:05:49.257 回答