标签: metaprogramming

Variadic模板:候选人需要1个参数,0提供(扣除错误)

看看这段代码

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

2
推荐指数
1
解决办法
672
查看次数

如何使用define_method编写带问号的方法

我有多种类型的用户模型(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,如何在元编程中创建带问号的方法?

ruby metaprogramming ruby-on-rails

2
推荐指数
1
解决办法
441
查看次数

如何创建一个抑制错误和警告的宏?

我想重新定义或覆盖一些函数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)

macros metaprogramming julia

2
推荐指数
1
解决办法
254
查看次数

是否可以检测函数中声明的局部变量的数量?

在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)

我想到的用例与验证用户提交的代码有关.

python metaprogramming

2
推荐指数
1
解决办法
589
查看次数

功能模板的宏:转义问题

我正在尝试为函数模板定义一个宏,即一个模板,您可以轻松地放入相关代码,但不希望向用户公开所有细节实现细节.例如,我想像这样将表达式放入更复杂的函数中:

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)

而更高级的用户仍然可以使用全功率.但是,如果您运行该代码,您将可以访问未定义的引用错误.我认为这是因为我没有正确地逃避表达,并且应该以某种方式逃避整个功能,但我不确定如何.

metaprogramming julia

2
推荐指数
1
解决办法
62
查看次数

实现C++模板以生成具有给定范围的索引序列

所以,C++ 14提供结构make_index_sequence<N>用于从生成索引序列0N-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)

c++ templates metaprogramming c++14

2
推荐指数
1
解决办法
486
查看次数

如何在ruby中将任何方法转换为中缀运算符

在诸如Haskell的某些语言中,可以使用任何带有两个参数的函数作为中缀运算符。

我觉得这种表示法很有趣,并且希望在红宝石中也能达到同样的效果。

给定一个假想的方法or_if_familiar ,我想能够写类似"omg" or_if_familiar "oh!",而不是or_if_familiar("omg", "oh!")

如何在ruby中创建这样的符号(不修改ruby本身)?

ruby metaprogramming operators

2
推荐指数
1
解决办法
825
查看次数

如果子类派生自基类,如何自动调用方法或生成代码?

我有一些描述能力/行为的类,比如飞行或驾驶等.每个类都有一个特定的方法,必须调用它来加载一些数据 - 例如,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)

c++ metaprogramming c++11

2
推荐指数
1
解决办法
80
查看次数

如何在ruby中将服务对象/模块作为参数传递

是否可以使用Module或对象作为ruby中每个方法的参数?

我需要类似的东西.

module PrintAny
  def call(text)
    puts text
   end
end

["any"].each PrintAny
Run Code Online (Sandbox Code Playgroud)

ruby metaprogramming ruby-on-rails-3

2
推荐指数
1
解决办法
381
查看次数

使用元编程重构包含"双管道"和"实例变量"的代码

我有两种方法:

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)

但它不起作用

有人有任何答案或更好的解决方案?

ruby metaprogramming

2
推荐指数
1
解决办法
81
查看次数