这个std :: decay的实现是否正确

时间:2015-07-22 14:55:01

标签: c++ templates

这个std :: decay的实现是正确的吗?

void main (void) {
   while(1) {
     if (!! Device A needs Service) { 
         !! Handle Device A
     }

     if (!! Device B needs Service) {
         !! Handle Device B
     }

     . . . .

     if (!! Device D needs Service) {
         !! Handle Device D
     }

     UpdateLCD();
   }
}

我问,因为我遇到的所有内容都使用了一些模板分支来仔细操作类型,而这似乎只是按照定义行事。

2 个答案:

答案 0 :(得分:6)

形成这样的函数调用需要传递值,这需要复制/移动构造函数。这种实现不够通用。

这是std::decay所做的要点。

答案 1 :(得分:4)

不,由于Potatoswatter给出的原因,这是不正确的。除了要求复制/移动构造函数按值返回之外,您根本不能按值返回某些类型:

#include <type_traits>

template<class T>
T DecayType(T);

template<class T>
struct decay {
    using type = decltype(DecayType(std::declval<T>()));
};

struct abstract { virtual void f() = 0; };

static_assert(std::is_same<decay<abstract&>::type, abstract>::value, "");

struct incomplete;

static_assert(std::is_same<decay<incomplete&>::type, incomplete>::value, "");

struct immortal { ~immortal() = delete; };

static_assert(std::is_same<decay<immortal&>::type, immortal>::value, "");