4

考虑这个简单的类:

template<class T>
class Foo{
public:
  Foo(T const& val)
    : _val(val) {}

  template<class U>
  Foo(Foo<U> const&){
    static_assert(false,"Cannot convert from Foo<U> to Foo<T>.");
  }

  operator T&() { return _val; }
  operator T const&() const{ return _val; }

private:
  T _val;
};

它允许从模板类型隐式构造和隐式转换回该类型,一个简单的包装器。

现在,我不想启用不相关Foo的 s 之间的转换,因为这些隐式构造/转换是可能的。我可以将模板化的 copy-ctor 设为私有,但我不想通过static_assert.

问题,如Ideone 上所示,static_assert即使我什至没有尝试复制类型,也会失败!在 Visual Studio 中,我得到了我想要的行为,尽管我认为这是由于 VS 解析模板的方式。有什么办法可以让这个工作吗?

4

2 回答 2

7

它编译失败,因为编译器可以清楚地看到static_assert无论如何都会失败。它不依赖于任何方式UT

我想你想要这样的东西:

static_assert(std::is_same<T,U>::value,"Cannot convert from Foo<U> to Foo<T>.");
于 2011-06-19T07:07:51.210 回答
2

似乎 std::is_convertible 是解决方案。

来自http://en.cppreference.com/w/cpp/types/is_convertible

“如果 From 类型的假想右值可以在返回 To 的函数的返回语句中使用,即如果可以使用隐式转换将其转换为 To,则提供等于 true 的成员常量值。否则 value 为 false。”

于 2012-08-30T12:53:38.687 回答