【发布时间】: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
我在 C++14 中有一个 T 类型,这样 std::is_convertible<T, X>::value 会为所有可能的 X 返回 true?
【问题讨论】:
标签: c++ templates type-conversion c++14 typetraits
你当然可以自己做一个:
#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;
}
【讨论】:
我们可以定义class B {~B() = delete;};
我们可以得出结论,对于任何给定的类型 T,总是存在至少一种类型 X,T 无法转换为。
【讨论】:
如果您只想让元函数始终返回 true,比如说因为您正在编写一些超级骗子元函数并且需要一个用于某些布尔逻辑的占位符,那么我只会犯罪并专门化模板:
struct everything {};
namespace std {
template<typename X>
struct is_convertible<everything, X> : true_type {};
};
虽然,不可否认,this answer 在这方面做得更好,因为它不会闯入std 命名空间并开始破坏模板。
否则,不,没有这种类型。至少没有类型会为您生成有效对象。
【讨论】: