- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
如果有人对程序感兴趣,GitHub project is here .虽然它工作得很好,但我已将其调低为仅算术类型。
future 的发展会带来更多。
谢谢大家
是的,我知道 this question .请阅读它以获得良好的介绍。还有一个聪明但不通用的解决方案。
我确实关心它,但我也确实需要一些基本类型作为不可转换。有了这个将严重限制引入错误的可能性。不仅允许没有隐式转换的函数调用,而且还用于变量创建、赋值、比较等。
我确信这已经被尝试过并且可能已经解决了。我的程序中不能有这个:
// implicit conversions
// no warnings
{
char character = 127 ;
bool truth = 0 ;
size_t size_ = truth ;
int integer = false ;
size_ = integer;
size_ = character ;
}
在我的 VS 2017(最新)中,即使在 Level 4
aka /W4
上,默认设置下编译也没有警告。 clang 7 等也是如此。
到目前为止,我已经设法开发了这个:
namespace dbj {
namespace util {
using namespace std;
template<typename T>
struct nothing_but final
{
static_assert(false == std::is_array_v<T>,
"can not deal with arrays");
using type = nothing_but;
// default creation
nothing_but() : val_(T{}) {}
// allowed conversion
nothing_but(T const & t_) : val_(t_) {}
// allowed assignment
type & operator = (T const & new_val_)
{
val_ = new_val_;
return *this;
}
/*
explictly ban all attempts to construct from
any other type but T
*/
template<
typename X,
std::enable_if_t<
false == std::is_same_v<T, X>
, int> = 0
>
nothing_but(X const & x_) = delete;
/*
explictly ban all attempts to assign from
any other type but T
*/
template<
typename X,
std::enable_if_t<
false == std::is_same_v<T, X>
, int> = 0
>
type & operator = (X const & new_val_) = delete;
/* conversion to X is banned */
template<
typename X,
std::enable_if_t<
false == std::is_same_v<T, X>
, int> = 0
>
operator X & () = delete;
// conversion to T is allowed, but const stays const
operator T & () { return val_; }
// non const value, as other std class types do
T & data() const { return (T&)val_; }
private:
T val_{};
// compatibility
friend bool operator < ( type const & left_, type const & right_)
{
return left_.val_ < right_.val_;
}
};
} // util
} // dbj
一些快速测试:
{
using dbj::util::nothing_but;
nothing_but<int> si1 = 42;
si1 = 42;
nothing_but<int> si2 = 13;
//nothing_but<int> si3 = true ;
//si3 = true;
//nothing_but<int> si4 = '$' ;
//si4 = '$';
//nothing_but<int> si5 = 2.7 ;
//si5 = 2.7;
//nothing_but<int> si6 = size_t(BUFSIZ) ;
//si6 = size_t(BUFSIZ);
si1 = si2; (void)(si1 == si2);
int j = 9;
nothing_but<int *> sip1 = &j;
nothing_but<char const *> scc1 = "OK";
char name[] = "c++";
// scc1 = name;
}
还有一些常量测试
{ // constnes
const int cc = 42;
const int cb = cc;
nothing_but<int> const & sci1 = cc;
nothing_but<int> const sci2 = sci1 ; // ok
const nothing_but<int> sci3 = sci1 ; // ok
wprintf(L"%d", sci1.data()); // ok
//sci2 = sci1;
//const int ii1 = sci1;
//const int ii2 = static_cast<int>(sci1);
//const int * ii3 = const_cast<int *>(&(sci1));
const int & ii3 = (const int &)(sci1); // ok
int & ii4 = (int &)(sci1); // ok
}
{ // compatibility
// std::vector<nothing_but<bool>> bv{ true, 1 , true };
std::vector<nothing_but<bool>> bv{ true, true , true };
nothing_but<bool> bb = bv[1] ;
bool kb = bb; // OK
//int k = bb;
//int j = bv[1];
std::map< nothing_but<bool>, nothing_but<int> > bm;
bm[true] = 1;
// bm[true] = 2.3;
bm[false] = 0;
// bm[false] = 0.9;
}
等等。注释掉的任何内容都不会编译。
到目前为止,我可以看到潜力,但我不确定我是否做对了?您会认为这很有用吗?如果您认为有用,您会采用不同的方式吗?
请注意,我需要称为“不可转换的基本类型”的通用解决方案。我希望它可以完成,完成后它可能非常小且通用。
最佳答案
你可以使用“方法模板重载”而不是 type_traits 来做到这一点:
template<typename T>
struct nothing_but final
{
// construction
nothing_but() = default;
nothing_but(const T& t_)
: val_(t_)
{}
template<typename Other>
nothing_but(const Other&) = delete;
// assignment
nothing_but& operator=(const T& new_val_)
{
val_ = new_val_;
return *this;
}
template<typename Other>
nothing_but& operator=(const Other&) = delete;
// comparison
bool operator==(const nothing_but& rhs) const
{
return (val_ == rhs.val_);
}
bool operator<(const nothing_but& rhs) const
{
return (val_ < rhs.val_);
}
// conversion
operator T& ()
{
return val_;
}
template<typename Other>
operator T& () = delete;
// non const value, as other std class types do
T& data() const
{
return (T&)val_;
}
template<typename Other>
operator Other& () = delete;
private:
T val_{};
};
非模板优先于模板(参见 C++ 标准 13.3.3,或在 http://www.gotw.ca/gotw/049.htm 中解释)。
关于c++ - 如何避免隐式可转换类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54836629/
我刚刚更新了 Ruby,现在我在尝试启动 compass 时遇到以下错误: Encoding::CompatibilityError on line ["28"] of /usr/local/Cell
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 6 年前。
关闭。这个问题需要debugging details .它目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and th
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我正在尝试在我的 iOS 应用程序中开发可折叠/ Accordion 式的功能。这将是您可以在网站上找到的典型 FAQ 类型功能。我想点击标题,然后显示详细信息。 因为这是帮助部分,只有几个项目,我认
我正在尝试设计一个基于 REST 的 Web 服务来与我正在开发的农场动物管理系统进行交互。 为了详细说明问题,我收藏了动物 属于一个农场。每只动物都有自己的信息——例如姓名、身份证号、品种年龄等。因
我有 3 种不同的表单,其中复选框数量不同,每个部分基本上代表一个表单,因此当用户选择该部分中的复选框时,它会显示他们在该部分的总金额中 checkout 了多少 HTML
我有一份 32 页的 PDF 版家谱。与其将家谱全部放在一个非常大的 PDF 页面上(这是我想要的),不如将其格式化为一组 8 个单独的美国信纸大小的页面应该在整个宽度上缝合; 4 行这样就完成了树。
指SASS implementation for Java? : 在 Maven 目标编译包中自动编译 compass-style.org 样式表的最佳方法是什么? 我不想发送太多的自编译库,也不想通
鉴于以下 XAML... 我正在寻找一种绑定(bind) ComboBox、Button 和 Command 的方法,以便当 ComboBox 的值更改时,在 Command 上调用 CanExe
在玩具应用程序中,我有一个显示所有帖子标题的“帖子”模板。当您单击每个标题时,我不想直接进入“显示” View ,而是直接内联展开该帖子的其余内容。 我考虑过让 postRoute 重用 postsR
我需要一些使用 Twitter Bootstrap 或其他响应式框架的自定义 Swagger-UI 实现。需要在我的移动设备上使用这样的 UI 测试我的 API,但 swagger-ui 不能很好地扩
我正在做一个项目,我真的在尝试编写面向对象的 JavaScript 代码。我刚刚开始阅读Douglas Crockford's JavaScript: The Good Parts我很快开始意识到用
在 C# 中,我通过执行以下操作来加密文本数据(请注意我正在以 block ( block )的形式加密数据): public string EncryptData(string pu
我正在构建一个社交网站,该网站将向全世界公开 REST API (WCF WebAPI),以便任何开发人员都能够为该网站创建客户端应用程序、将其与其他服务集成等。 我想为 API 实现 Faceboo
我是一名优秀的程序员,十分优秀!