如何仅在实际使用成员模板时才在其中静态断言
How to static_assert in member templates only when they are actually used?
考虑这个简单的类:
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之间的转换,这是可能的,因为这些隐式构造/转换。我可以将模板化的复制器设为私有的,但我不想通过static_assert
发出有用的诊断。
问题是,如Ideone上所示,即使我甚至没有尝试复制类型,static_assert
也会失败!在VisualStudio中,我得到了我想要的行为,尽管我认为这是由于VS解析模板的方式。有什么办法让它发挥作用吗?
编译失败,因为编译器可以清楚地看到static_assert
无论如何都会失败。它在任何方面都不依赖于U
和T
。
我想你想要这样的东西:
static_assert(std::is_same<T,U>::value,"Cannot convert from Foo<U> to Foo<T>.");
似乎std::is_convertable就是解决方案。
发件人http://en.cppreference.com/w/cpp/types/is_convertible:
"如果在返回To的函数的返回语句中可以使用From类型的虚值,也就是说,如果可以使用隐式转换将其转换为To,则提供等于true的成员常数值。否则,值为false。"
相关文章:
- 当我在其中一个线程执行中(在activemq-cpp中)捕获到特定值时,我如何终止/停止所有其他线程
- 修改链表主函数代码,用户将在其中输入节点的索引和数据以及正确的消息
- 如果我们在其中输入一个整数,则字符会给出整数作为输出,但是当分配给它一个整数时,这不会发生。为什么?
- 我写了一个简单的矢量程序,在其中我得到了以下输出。你能帮我理解它的输出吗?
- 为什么我的数组输出一个不在其中的元素
- 定义在其中执行不同代码路径的代码节
- 这是我的 .h 文件的一些错误,当我在其中包含我的类模板时,它显示 [错误] 未终止 #ifndef
- 是否可以检索与柯南包管理器一起打包的库的源代码,以便在其中进行调试?
- C :宏参数可以在其中有空间吗?
- C++要在其中添加接口功能的类层次结构
- 如何制作一个结构程序,在其中可以存储无限量的数据,以便每次您想要时都可以将另一个产品添加到列表中?
- 程序在其中一个案例完成后终止,但对于其他情况则不终止
- 是否允许编译器在静态断言中评估重言式
- openCv 3中的等效polyfit函数在其中
- CMake:如何指定 ctest 应该在其中查找可执行文件的目录
- 如何在其中创建2D字符串向量并插入数据
- C 迭代用于循环并在其中调用功能
- 该代码不会在其中显示任何数字输入.如何使它显示任何输入
- 如何在%appdata%中创建文件夹,在其中创建.bat文件,然后执行它?
- 如何仅在实际使用成员模板时才在其中静态断言