假设我有一个结构 Foo,我想确定 Foo 中是否有一个 int。
struct Foo { int a; char c; };
has_int<Foo>::value; // should be true
这是我真正想要的最基本形式,检查特定类型:
has_type<Foo, int>::value;
如果我知道如何执行上述操作,我可以将其转换为我的最终目标:
has_pointer<Foo>::value; // false
struct Bar { int a; void *b; };
has_pointer<Bar>::value; // true
至于我尝试过的,很难开始,我能想到的最好的是,如果我能得到一个结构中包含的类型的包,我可以写剩下的:
template <typename... Ts>
constexpr bool any_is_pointer() noexcept {
return (... || std::is_pointer_v<Ts>);
}
我所要求的似乎很可能是不可能的。我找不到拷贝,但令我惊讶的是我找不到,所以它可能就在那里。
最佳答案
正如其他人所说,对于任意类型,您现在想要的东西对于普通 C++ 是不可能的。但是,如果您能够提供特定的编译时信息以及您需要在其定义中操作的类型,您就可以做您想做的事。
您可以使用 boost 融合库的适配器来执行此操作,它允许您调整现有结构以成为融合容器或定义为融合容器建模的新结构。然后,您可以使用您想要的任何 boost::mpl 算法来执行您想要执行的编译时检查类型。
考虑这个例子,使用你的 struct foo 和你想要的 has_type 编译时算法:
#include <boost/fusion/adapted/struct/define_struct.hpp>
#include <boost/mpl/contains.hpp>
BOOST_FUSION_DEFINE_STRUCT(
(your_namespace), foo,
(int, a)
(char, c))
template<typename source_type, typename search_type>
struct has_type
{
typedef typename boost::mpl::contains<source_type, search_type>::type value_type;
static const bool value = value_type::value;
};
#include <iostream>
int main()
{
bool foo_has_int_pointer = has_type<your_namespace::foo, int*>::value;
bool foo_has_int = has_type<your_namespace::foo, int>::value;
std::cout << "foo_has_int_pointer: " << foo_has_int_pointer << "\n";
std::cout << "foo_has_int: " << foo_has_int << "\n";
your_namespace::foo my_foo;
my_foo.a = 10;
my_foo.c = 'x';
std::cout << "my_foo: " << my_foo.a << ", " << my_foo.c;
}
在此处查看输出或混淆示例:http://ideone.com/f0Zc2M
如您所见,您使用 BOOST_FUSION_DEFINE_STRUCT 宏来定义您希望在编译时对其成员进行操作的 struct。 fusion 提供了几个其他宏来定义这样的结构,以及用于调整已经定义的结构的宏。检查一下 here .
当然,您可能已经知道这里的缺点。 has_type 仅在 source_type 是 boost::mpl/boost::fusion 序列时才有效。对于您来说,这意味着您想要在编译时以这种方式推理的任何类型,都需要使用宏来定义或修改。如果您正在编写旨在用于任意库用户定义类型的库,这可能对您来说是 Not Acceptable 。
关于c++ - 确定结构是否具有特定类型的成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32791440/
给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru
我想安装一个带有一些身份验证的私有(private)Rubygem服务器。我希望能够使用公共(public)Ubuntu服务器托管内部gem。我读到了http://docs.rubygems.org/read/chapter/18.但是那个没有身份验证-如我所见。然后我读到了https://github.com/cwninja/geminabox.但是当我使用基本身份验证(他们在他们的Wiki中有)时,它会提示从我的服务器获取源。所以。如何制作带有身份验证的私有(private)Rubygem服务器?这是不可能的吗?谢谢。编辑:Geminabox问题。我尝试“捆绑”以安装新的gem..
我想将html转换为纯文本。不过,我不想只删除标签,我想智能地保留尽可能多的格式。为插入换行符标签,检测段落并格式化它们等。输入非常简单,通常是格式良好的html(不是整个文档,只是一堆内容,通常没有anchor或图像)。我可以将几个正则表达式放在一起,让我达到80%,但我认为可能有一些现有的解决方案更智能。 最佳答案 首先,不要尝试为此使用正则表达式。很有可能你会想出一个脆弱/脆弱的解决方案,它会随着HTML的变化而崩溃,或者很难管理和维护。您可以使用Nokogiri快速解析HTML并提取文本:require'nokogiri'h
我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server
这个问题在这里已经有了答案:Checktoseeifanarrayisalreadysorted?(8个答案)关闭9年前。我只是想知道是否有办法检查数组是否在增加?这是我的解决方案,但我正在寻找更漂亮的方法:n=-1@arr.flatten.each{|e|returnfalseife
我可以得到Infinity和NaNn=9.0/0#=>Infinityn.class#=>Floatm=0/0.0#=>NaNm.class#=>Float但是当我想直接访问Infinity或NaN时:Infinity#=>uninitializedconstantInfinity(NameError)NaN#=>uninitializedconstantNaN(NameError)什么是Infinity和NaN?它们是对象、关键字还是其他东西? 最佳答案 您看到打印为Infinity和NaN的只是Float类的两个特殊实例的字符串
我不确定传递给方法的对象的类型是否正确。我可能会将一个字符串传递给一个只能处理整数的函数。某种运行时保证怎么样?我看不到比以下更好的选择:defsomeFixNumMangler(input)raise"wrongtype:integerrequired"unlessinput.class==FixNumother_stuffend有更好的选择吗? 最佳答案 使用Kernel#Integer在使用之前转换输入的方法。当无法以任何合理的方式将输入转换为整数时,它将引发ArgumentError。defmy_method(number)
我正在编写一个方法,它将在一个类中定义一个实例方法;类似于attr_accessor:classFoocustom_method(:foo)end我通过将custom_method函数添加到Module模块并使用define_method定义方法来实现它,效果很好。但我无法弄清楚如何考虑类(class)的可见性属性。例如,在下面的类中classFoocustom_method(:foo)privatecustom_method(:bar)end第一个生成的方法(foo)必须是公共(public)的,第二个(bar)必须是私有(private)的。我怎么做?或者,如何找到调用我的cust
我有一个包含多个键的散列和一个字符串,该字符串不包含散列中的任何键或包含一个键。h={"k1"=>"v1","k2"=>"v2","k3"=>"v3"}s="thisisanexamplestringthatmightoccurwithakeysomewhereinthestringk1(withspecialcharacterslike(^&*$#@!^&&*))"检查s是否包含h中的任何键的最佳方法是什么,如果包含,则返回它包含的键的值?例如,对于上面的h和s的例子,输出应该是v1。编辑:只有字符串是用户定义的。哈希将始终相同。 最佳答案
对于Rails模型,是否可以/建议让一个类的成员不持久保存到数据库中?我想将用户最后选择的类型存储在session变量中。由于我无法从我的模型中设置session变量,我想将值存储在一个“虚拟”类成员中,该成员只是将值传递回Controller。你能有这样的类(class)成员吗? 最佳答案 将非持久属性添加到Rails模型就像任何其他Ruby类一样:classUser扩展解释:在Ruby中,所有实例变量都是私有(private)的,不需要在赋值前定义。attr_accessor创建一个setter和getter方法:classUs