相关疑难解决方法(0)

在编译时检测typedef(模板元编程)

我目前正在做一些模板元编程.在我的情况下,我可以处理任何"可迭代"类型,即typedef foo const_iterator以相同方式存在的任何类型.我试图使用新的C++ 11模板元编程,但是我找不到一种方法来检测是否缺少某种类型.

因为我还需要根据其他特性打开/关闭其他模板专精,我目前正在使用带有两个参数的模板,第二个是通过生成的std::enable_if.这是我目前正在做的事情:

template <typename T, typename Enable = void>
struct Foo{}; // default case is invalid

template <typename T>
struct Foo< T, typename std::enable_if<std::is_fundamental<T>::value>::type>{ 
   void do_stuff(){ ... }
};

template<typename T>
struct exists{
   static const bool value = true;
};

template<typename T>
struct Foo<T, typename std::enable_if<exists< typename T::const_iterator >::value >::type> {
    void do_stuff(){ ... }
};
Run Code Online (Sandbox Code Playgroud)

没有exists帮助模板,我无法做到这样的事情.比如简单地做

template<typename T>
struct Foo<T, typename T::const_iterator> {
    void do_stuff(){ ... }
};
Run Code Online (Sandbox Code Playgroud)

不起作用,因为在应该使用此专门化的情况下,实例化了无效的默认情况.

但是我 …

c++ sfinae type-traits template-meta-programming c++11

12
推荐指数
2
解决办法
5507
查看次数

C++模板:如何确定类型是否适合子类化

假设我有一些模板类,具体取决于类型T. T可能是几乎所有的东西:int,int*,pair <int, int>struct lol; 它不能void,参考或任何cv资格但是.对于某些优化,我需要知道我是否可以继承T.所以,我需要一些特质类型is_subclassable,确定为基本特征的逻辑组合或通过一些SFINAE技巧.

在原始示例中,int并且int*不是子类,pair <int, int>而且struct lol是.

编辑:正如下面指出的litb,工会也不是可子类化的,T也可以是联合类型.

如何编写我需要的特征类型?

c++ type-traits template-meta-programming

11
推荐指数
1
解决办法
729
查看次数

如何通过SFINAE测试班级内部班级的存在?

我正在尝试为具有特定名称的内部类的类提供不同的模板特化.我从这里找到了一个线索并尝试了以下方法:

#include <iostream>

template< typename T, typename Check = void > struct HasXYZ
{ static const bool value = false; };

template< typename T > struct HasXYZ< T, typename T::XYZ >
{ static const bool value = true; };

struct Foo
{
  class XYZ {};
};

struct FooWithTypedef
{
  typedef void XYZ;
};

int main()
{
  // The following line prints 1, as expected
  std::cout << HasXYZ< FooWithTypedef >::value << std::endl;
  // The following line prints 0. Why? …
Run Code Online (Sandbox Code Playgroud)

c++ sfinae template-specialization

9
推荐指数
1
解决办法
699
查看次数