看看这段代码
template<class T>
void print(T var)
{
std::cout << var << " ";
}
template<class... Args>
void Variadic(Args... args)
{
print(args...);
}
int main()
{
Variadic();
}
Run Code Online (Sandbox Code Playgroud)
当我编译它时说:
候选人:模板无效打印(T)
候选人期望1个参数,0提供
他是对的.实际上,我没有在参数包中提供任何参数.
但是,为什么这段代码会编译?
template<class T>
void print(T var)
{
std::cout << var << " ";
}
template<class... Args>
void Variadic(Args... args)
{
auto x = {0, (print(args), 0)...};
}
int main()
{
Variadic();
}
Run Code Online (Sandbox Code Playgroud)
我要做的第一件事就是将第一个0推入initializer_list <>
好的,现在让我们继续:编译器看到
(print(args), 0)...
Run Code Online (Sandbox Code Playgroud)
它试图调用print()...哦等待... 参数包是空的,print()函数有1个参数.
为什么它会评估auto x = {0};呢?
为什么编译器没有给我与以前完全相同的错误?
c++ templates metaprogramming template-function variadic-templates
我有多种类型的用户模型(admin,normal,..).我创建循环来定义类似admin?或normal?如下的方法:
class User
TYPES = %w(admin normal)
User::TYPES.each do |roleVal|
define_method(roleVal.to_sym) { self.role == roleVal }
end
end
Run Code Online (Sandbox Code Playgroud)
上面的代码正在工作User.first.admin,但我需要将其称为User.first.admin?.
带问号的define_method的语法是什么?如果不可能使用define_method,如何在元编程中创建带问号的方法?
我想重新定义或覆盖一些函数Base,而不是用户注意到这一点.我前一段时间发现了这个伎俩:
original_stderr = STDERR
redirect_stderr()
# code
redirect_stderr(original_stderr)
Run Code Online (Sandbox Code Playgroud)
这成了我的重复模式,所以我做了一个宏:
macro suppress_err(block)
quote
orig_err = STDERR
redirect_stderr()
val = $block
redirect_stderr(orig_err)
val
end
end
Run Code Online (Sandbox Code Playgroud)
但它从未像预期的那样表现(即使没有宏):
在Windows中:
julia> @suppress_err warn()
julia> @suppress_err error()
ERROR:
in error at error.jl:22
Run Code Online (Sandbox Code Playgroud)
适用于Linux的Windows子系统:
julia> @suppress_err warn()
[1] 17 abort (core dumped) julia
julia 7.69s user 2.36s system 106% cpu 9.441 total
Run Code Online (Sandbox Code Playgroud)
在Linux中:
julia> @suppress_err +(x, y) = x - y
ERROR: UndefVarError: #11#x not defined
in eval(::Module, ::Any) …Run Code Online (Sandbox Code Playgroud) 在Python测试夹具中,是否可以计算函数在其体内声明的局部变量数量?
def foo():
a = 1
b = 2
Test.assertEqual(countLocals(foo), 2)
Run Code Online (Sandbox Code Playgroud)
或者,有没有办法看一个函数是否声明了任何变量?
def foo():
a = 1
b = 2
def bar():
pass
Test.assertEqual(hasLocals(foo), True)
Test.assertEqual(hasLocals(bar), False)
Run Code Online (Sandbox Code Playgroud)
我想到的用例与验证用户提交的代码有关.
我正在尝试为函数模板定义一个宏,即一个模板,您可以轻松地放入相关代码,但不希望向用户公开所有细节实现细节.例如,我想像这样将表达式放入更复杂的函数中:
macro make_complex_function(ex)
quote
function (alg,f,t,u,k)
# Add some stuff on top
condition1 = false
condition2 = false
#...
#Put in the user's code
$(esc(ex))
# Put a footer
return some,stuff,here,long,annoying,list
end
end
end
Run Code Online (Sandbox Code Playgroud)
因此用户可以轻松插入一小部分逻辑(使用简化的API /文档):
easy_func = @make_complex_function begin
if u > 1
print("oh no! It happened!")
end
end
Run Code Online (Sandbox Code Playgroud)
而更高级的用户仍然可以使用全功率.但是,如果您运行该代码,您将可以访问未定义的引用错误.我认为这是因为我没有正确地逃避表达,并且应该以某种方式逃避整个功能,但我不确定如何.
所以,C++ 14提供结构make_index_sequence<N>用于从生成索引序列0到N-1.我想知道如何实现一个生成给定范围内的索引序列.例如:
template <size_t Min, size_t Max>
struct make_index_range;
// make_index_range<5, 9> will give index_sequence<5, 6, 7, 8>
Run Code Online (Sandbox Code Playgroud) 在诸如Haskell的某些语言中,可以使用任何带有两个参数的函数作为中缀运算符。
我觉得这种表示法很有趣,并且希望在红宝石中也能达到同样的效果。
给定一个假想的方法or_if_familiar
,我想能够写类似"omg" or_if_familiar "oh!",而不是or_if_familiar("omg", "oh!")
如何在ruby中创建这样的符号(不修改ruby本身)?
我有一些描述能力/行为的类,比如飞行或驾驶等.每个类都有一个特定的方法,必须调用它来加载一些数据 - 例如,Flyable有loadFlyData(),Drivable有loadDriveData().对于每个类,方法名称是唯一的.
我有许多派生类可以从一个或多个这些行为类继承.每个派生类都有一个调用的方法loadData(),在此我们应该调用所有父类行为的方法,如loadFlyData(),loadDriveData()等....是否有办法来自动生成使用元编程这种方法吗?由于有许多派生类,如果我可以使用元编程生成这些方法,它可能更易于维护...
行为类:(一个对象类可能有任何这些行为,并且必须调用那些类"加载"方法......
class Flyable {
void loadFlyData() {
}
};
class Drivable{
void loadDriveData() {
}
};
Run Code Online (Sandbox Code Playgroud)
所有对象类都派生自Object:
class Object {
virtual void loadData() {
}
};
Run Code Online (Sandbox Code Playgroud)
派生类:
class FlyingCar : public Object, public Flyable, public Drivable {
virtual void loadData() override {
// How to automatically generate code so that the next two lines are called:
loadFlyData();
loadDriveData();
}
};
Run Code Online (Sandbox Code Playgroud) 是否可以使用Module或对象作为ruby中每个方法的参数?
我需要类似的东西.
module PrintAny
def call(text)
puts text
end
end
["any"].each PrintAny
Run Code Online (Sandbox Code Playgroud) 我有两种方法:
def ios_ids
@ios_ids ||= Array(GcmToken.find_by(users_id: "#{@event.user_id}", os_type: 'ios', alive: true).try(:reg_id))
end
def android_ids
@android_ids ||= Array(GcmToken.find_by(users_id: "#{@event.user_id}", os_type: 'android', alive: true).try(:reg_id))
end
Run Code Online (Sandbox Code Playgroud)
我想把它们折射成下面的东西
%w(android ios).each do |os_type|
define_method(:"#{os_type}_ids") { "@#{os_type}_ids" ||= Array(GcmToken.find_by(users_id: "#{@event.user_id}", os_type: os_type, alive: true).try(:reg_id))}
end
Run Code Online (Sandbox Code Playgroud)
但它不起作用
有人有任何答案或更好的解决方案?