免责声明:问题与继承而不是typedef完全不同,到目前为止我找不到任何类似的问题
我喜欢玩c ++模板元编程(在家里大多数情况下,我有时会在工作中轻轻地介绍它,但我不希望程序只对任何不打扰学习它的人都可读),但是我一直在每当出现问题时都会被编译器错误搞清楚.
问题是当然c ++模板元编程基于模板,因此当你在深层嵌套的模板结构中得到编译器错误时,你必须在10行错误消息中挖掘你的方式.我甚至习惯于在文本编辑器中复制/粘贴消息,然后缩进消息以获得一些结构,直到我了解实际发生的事情,这增加了一些跟踪错误本身的工作.
据我所知,问题主要是由于编译器以及它如何输出typedef(还有其他问题,如嵌套的深度,但它并不是编译器的错误).即将发布的C++ 0x宣布了可变参数模板或类型演绎(自动)等酷炫功能,但我真的希望有更好的错误消息来启动.使用模板元编程可能会让人感到痛苦,而且我确实想知道当更多人真正进入它们时会发生什么.
我已经替换了代码中的一些typedef,而是使用了继承.
typedef partition<AnyType> MyArg;
struct MyArg2: partition<AnyType> {};
Run Code Online (Sandbox Code Playgroud)
这不是更多的字体,我认为这并不是那么可读.实际上它甚至可能更具可读性,因为它保证声明的新类型看起来接近左边距,而不是在右边的未确定偏移处.
然而,这涉及另一个问题.为了确保我没有做任何愚蠢的事情,我经常编写模板函数/类,如下所示:
template <class T> T& get(partition<T>&);
Run Code Online (Sandbox Code Playgroud)
这样我就确定只能为合适的对象调用它.
特别是当重载运算符(如operator +)时,您需要某种方法来缩小运算符的范围,或者冒着为int调用它的风险.
但是,如果这适用于typedef类型,因为它只是一个别名.它肯定不适用于继承......
对于功能,可以简单地使用CRTP
template <class Derived, class T> partition;
template <class Derived, class T> T& get(partition<Derived,T>&);
Run Code Online (Sandbox Code Playgroud)
这允许知道在编译器使用公共继承之前用于调用方法的"真实"类型.应该注意,这减少了必须调用此特定函数的机会,因为编译器必须执行转换,但到目前为止我从未注意到任何问题.
此问题的另一个解决方案是向我的类型添加"标记"属性,以区分它们,然后依靠SFINAE.
struct partition_tag {};
template <class T> struct partition { typedef partition_tag tag; ... };
template <class T>
typename boost::enable_if<
boost::same_type<
typename T::tag,
partition_tag
>,
T&
>::type
get(T&)
{
...
}
Run Code Online (Sandbox Code Playgroud)
它需要更多的打字,特别是如果一个人在不同的地方声明并定义了函数/方法(如果我不打扰我的界面很快就会混乱).但是,当涉及到类时,由于没有执行类型转换,它确实变得更复杂:
template <class …Run Code Online (Sandbox Code Playgroud) 有人可以告诉我这段代码有什么问题吗?基本上我正在做的是为一些GET变量创建一个php数组.然后,我从该php数组创建一个js数组并将其传递给js函数.问题是没有调用该函数.我没有看到弹出"hi"警告.
<script type="text/javascript">
function change_values(js_array)
{
alert("hi");
}
</script>
<?php
$first_date_month = @$_GET["first_date_month"];
$last_date_month = @$_GET["last_date_month"];
$resume_date_month = @$_GET["resume_date_month"];
$pay_date_month = @$_GET["pay_date_month"];
$first_date_day = @$_GET["first_date_day"];
$last_date_day = @$_GET["last_date_day"];
$resume_date_day = @$_GET["resume_date_day"];
$pay_date_day = @$_GET["pay_date_day"];
$pay_time_hour = @$_GET["pay_time_hour"];
$pay_time_minutes = @$_GET["pay_time_minutes"];
$args = array($first_date_month, $first_date_day, $last_date_month, $last_date_day, $resume_date_month, $resume_date_day, $pay_date_month, $pay_date_day, $pay_time_hour, $pay_time_minutes);
print_r($args);
echo "<script language='text/javascript'>\n";
echo "var js_array = new Array();\n";
foreach($args as $key => $value)
echo "js_array[$key] = $value;\n";
echo "change_values(js_array)\n";
echo "</script>\n";
Run Code Online (Sandbox Code Playgroud)
一些html源代码可能有助于更好地理解正在发生的事情.
<script type="text/javascript">
function change_values(js_array) …Run Code Online (Sandbox Code Playgroud) 我正在努力将我的标准PHP项目转换为OOP,但我遇到了关于如何使用PHP类处理AJAX调用的问题.我对我现在这样做的方式不满意.我有一个TillAjax.php文件,我从一个AJAX调用的TillUI.php文件中调用它.
在TillAjax.php文件中,我这样做是为了获取从ajax调用传递的信息.
$till = new Till();
if(isset($_POST['data']))
$till->doStuff($_POST['data']);
Run Code Online (Sandbox Code Playgroud)
我认为这会破坏OOP.
我使用过ASP.NET MVC,在这里可以调用控制器中的特定操作,而不必检查post值.所以我想知道是否有更聪明的PHP方法来解决上述问题?
我正在寻找可以在Google App Engine上运行的国际象棋AI.大多数国际象棋AI似乎是用C语言编写的,所以不能在GAE上运行.它需要足够强大才能击败休闲玩家,但足够高效,可以在单个请求中计算移动(小于10秒).
理想情况下,它将用Python编写,以便更容易地与现有代码集成.
我遇到了一些有前途的项目,但看起来并不成熟:
考虑以下程序.
#include<iostream>
using namespace std;
class base
{
public:
int _bval;
base():_bval(0){}
};
class derived:public base
{
public:
int _dval;
derived():base(),_dval(1){}
};
int main()
{
derived d[5];
base *p;
p=d;
for(int i=0;i<5;++i,++p)
cout<<p->_bval;
}
Run Code Online (Sandbox Code Playgroud)
上面程序
的输出是01010. 我认为输出将是00000,因为_bval的值被基类构造函数初始化为0(每次).
但为什么输出与00000不同?
我错过了什么?
我必须对具有多个属性的python列表进行排序.我可以轻松地按升序排列所有属性
L.sort(key=operator.attrgetter(attribute))....
Run Code Online (Sandbox Code Playgroud)
但问题是,我已经使用混合配置进行升序/降序......我必须"模仿"一些SQL命令,你可以在那里做一些像"命名ASC,年DESC"的事情.有没有办法在python中轻松实现这一点,而无需实现自定义比较功能?
我有一个DataGridView.一些单元从串口接收数据:我想将数据推入单元,并让它更新底层绑定对象.
我正在尝试这样的事情:
SetValueFromSerial (decimal newValue)
{
dataGridView.CurrentCell.Value = newValue;
}
Run Code Online (Sandbox Code Playgroud)
使用字符串没有帮助:
dataGridView.CurrentCell.Value = newValue.ToString ();
Run Code Online (Sandbox Code Playgroud)
在这两种情况下,我都没有在网格中看到任何内容,并且基础值没有变化.
我在谷歌搜索并在这里搜索,但我没有找到任何东西.(我可能错过了一些东西,也许是显而易见的东西,但我并不是完全懒惰.)
假设我有这个表:
ID | description
-------------------
5 | The bird flew over the tree.
2 | The birds, flew over the tree
Run Code Online (Sandbox Code Playgroud)
这两行具有"相似"的内容.我如何删除#2?
谢谢!
有人可以告诉我我的会话将持续多长时间从下面的数据? - 我不确定哪一个告诉我
session.auto_start Off Off
session.bug_compat_42 Off Off
session.bug_compat_warn On On
session.cache_expire 180 180
session.cache_limiter nocache nocache
session.cookie_domain no value no value
session.cookie_httponly Off Off
session.cookie_lifetime 0 0
session.cookie_path / /
session.cookie_secure Off Off
session.entropy_file no value no value
session.entropy_length 0 0
session.gc_divisor 1000 1000
session.gc_maxlifetime 1440 1440
session.gc_probability 1 1
session.hash_bits_per_character 5 5
session.hash_function 0 0
session.name PHPSESSID PHPSESSID
session.referer_check no value no value
session.save_handler files files
session.save_path /var/lib/php/session /var/lib/php/session
session.serialize_handler php php
session.use_cookies On On
session.use_only_cookies Off …Run Code Online (Sandbox Code Playgroud) 我YES在视图控制器的shouldAutorotateToInterfaceOrientation函数YES中返回,我可以看到正在返回的断点,但是willRotateToInterfaceOrientation没有调用该方法,也没有任何其他旋转方法.好像回来后YES没有任何事情发生!
有任何想法吗?
麦克风