在看到许多 C++ 元编程示例后,这些示例允许找出类的可能属性(例如 knowing if a type is a specialization of a template ),或者知道一个类是否包含给定的嵌套类型;但我想知道是否有可能编写一个测试或特征来确定最后一个的逆 - 检查给定的 Type 是否嵌套在 class 或 结构。
换句话说,我正在寻找以下伪代码的等价物:
template <typename Type> struct is_nested {
enum { value = {__some magic__} };
};
typedef int type1;
struct Something { typedef int internal_type; };
typedef Something::internal_type type2;
//...later, likely at a different scope
is_nested< int >::value; // yields false
is_nested< std::vector<int>::iterator >::value; // yields true
is_nested< type1 >::value; // yields false
is_nested< type2 >::value; // yields true
我知道我可以使用 sizeof 来实现是/否测试,并且我认为 Type 是这些测试的一部分,但我不知道如何插入在测试中加入某种“任何可行的类型”,这样我就可以形成像 Anytype::Type 这样的表达式。
template
struct is_nested
{
typedef char yes;
typedef struct { char u[2]; } no;
// Herein lies the problem
???? static yes test( char [ sizeof(Anytype::Type) ] ) ;
???? static no test(...);
public:
enum { value = sizeof(test(0)) == sizeof(char) };
};
(请注意,我不关心也(负担不起)知道 什么 类型将 Type 嵌套在其中;重要的是它是否嵌套在 < em="">某物 或不。换句话说,此特征应该仅 取决于类型。)
我正在寻找 C++ 解决方案,无论是 C++11 还是 C++03,但在第一种情况下,如果它可以向后移植,我会更欢迎它。
最佳答案
你问的是不可能的,但不是由于技术限制,而是因为你不能总是判断类型名称是否标识嵌套类型 - 并且模板适用于类型 ,不是名字。
在这种情况下,例如:
is_nested< std::vector<int>::iterator >::value
你不知道什么iterator是。考虑这门课 my_vector :
template<typename T>
struct my_vector
{
typedef T* iterator;
// ...
};
应该做什么is_nested<my_vector<int>::iterator>::value屈服?您可能希望结果为 true .
然而,这里嵌套的是别名,而不是类型本身:类型int*没有嵌套。事实上,我希望您希望以下内容产生 false :
is_nested<int*>::value
所以这里是一样的is_nested<T>给定相同的类型,特征应该产生两个不同的结果 T ( int* ,在这种情况下)。 is_nested<>所依据的信息应该定义 value无法从类型 T 中检索本身 - 模板使用类型,而不是名称。
关于C++ - 知道类型/类是否嵌套?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16324306/
给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru
我得到了一个包含嵌套链接的表单。编辑时链接字段为空的问题。这是我的表格:Editingkategori{:action=>'update',:id=>@konkurrancer.id})do|f|%>'Trackingurl',:style=>'width:500;'%>'Editkonkurrence'%>|我的konkurrencer模型:has_one:link我的链接模型:classLink我的konkurrancer编辑操作:defedit@konkurrancer=Konkurrancer.find(params[:id])@konkurrancer.link_attrib
这道题是thisquestion的逆题.给定一个散列,每个键都有一个数组,例如{[:a,:b,:c]=>1,[:a,:b,:d]=>2,[:a,:e]=>3,[:f]=>4,}将其转换为嵌套哈希的最佳方法是什么{:a=>{:b=>{:c=>1,:d=>2},:e=>3,},:f=>4,} 最佳答案 这是一个迭代的解决方案,递归的解决方案留给读者作为练习:defconvert(h={})ret={}h.eachdo|k,v|node=retk[0..-2].each{|x|node[x]||={};node=node[x]}node[
我的瘦服务器配置了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)
我有一个包含多个键的散列和一个字符串,该字符串不包含散列中的任何键或包含一个键。h={"k1"=>"v1","k2"=>"v2","k3"=>"v3"}s="thisisanexamplestringthatmightoccurwithakeysomewhereinthestringk1(withspecialcharacterslike(^&*$#@!^&&*))"检查s是否包含h中的任何键的最佳方法是什么,如果包含,则返回它包含的键的值?例如,对于上面的h和s的例子,输出应该是v1。编辑:只有字符串是用户定义的。哈希将始终相同。 最佳答案
我需要检查DateTime是否采用有效的ISO8601格式。喜欢:#iso8601?我检查了ruby是否有特定方法,但没有找到。目前我正在使用date.iso8601==date来检查这个。有什么好的方法吗?编辑解释我的环境,并改变问题的范围。因此,我的项目将使用jsapiFullCalendar,这就是我需要iso8601字符串格式的原因。我想知道更好或正确的方法是什么,以正确的格式将日期保存在数据库中,或者让ActiveRecord完成它们的工作并在我需要时间信息时对其进行操作。 最佳答案 我不太明白你的问题。我假设您想检查
我的日期格式如下:"%d-%m-%Y"(例如,今天的日期为07-09-2015),我想看看是不是在过去的七天内。谁能推荐一种方法? 最佳答案 你可以这样做:require"date"Date.today-7 关于ruby-检查日期是否在过去7天内,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/32438063/