【问题标题】:A type to which everything can be converted to?什么都可以转换成的类型?
【发布时间】:2017-03-27 12:36:21
【问题描述】:

我在 C++14 中有一个 T 类型,这样 std::is_convertible<T, X>::value 会为所有可能的 X 返回 true

【问题讨论】:

  • 您希望元函数始终返回 true,还是希望该类型为任何 X 实际生成有效对象?

标签: c++ templates type-conversion c++14 typetraits


【解决方案1】:

你当然可以自己做一个:

#include <string>
#include <type_traits>

struct Foo
{
  template <class T>
  operator T();
};

int main() 
{
  struct Bar{};
  static_assert(std::is_convertible<Foo, int>::value, "");
  static_assert(std::is_convertible<Foo, std::string>::value, "");
  static_assert(std::is_convertible<Foo, Bar>::value, "");
  return 0;
}

【讨论】:

  • 打败了我。在 C++17 中有 std::any,但比较有限
  • 一切都可以转换!只是不要尝试实际进行转换;)
  • @StoryTeller 可以用普通类型实现,但不能用具有 vtable 的类实现,这将是一个 UB 工厂
  • @felix 除非这是不可能的,因为没有 void 实例。
  • @Swift - 如果类具有适当的构造函数,则该实现不会未定义任何内容。当它失败时,它将是一个硬编译错误,看不到 UB。
【解决方案2】:

我们可以定义class B {~B() = delete;};

我们可以得出结论,对于任何给定的类型 T,总是存在至少一种类型 X,T 无法转换为。

【讨论】:

    【解决方案3】:

    如果您只想让元函数始终返回 true,比如说因为您正在编写一些超级骗子元函数并且需要一个用于某些布尔逻辑的占位符,那么我只会犯罪并专门化模板:

    struct everything {};
    
    namespace std {
        template<typename X>
        struct is_convertible<everything, X> : true_type {};
    };
    

    虽然,不可否认,this answer 在这方面做得更好,因为它不会闯入std 命名空间并开始破坏模板。

    否则,不,没有这种类型。至少没有类型会为您生成有效对象。

    【讨论】:

      猜你喜欢
      • 2012-12-30
      • 1970-01-01
      • 1970-01-01
      • 2013-03-08
      • 2015-06-28
      • 2014-04-04
      • 2016-04-02
      • 1970-01-01
      • 2014-07-31
      相关资源
      最近更新 更多