我一直在学习可变参数模板,在这篇优秀博客文章的帮助下,我设法编写了一个函数模板even_number_of_args,它返回它接收的参数数量是否可被2整除.
#include <iostream>
bool even_number_of_args() {
return true;
}
template <typename T>
bool even_number_of_args(T _) {
return false;
}
template<typename T, typename U, typename... Vs>
bool even_number_of_args(T _, U __, Vs... vs) {
return even_number_of_args(vs...);
}
int main() {
std::cout << even_number_of_args() << std::endl; // true
std::cout << even_number_of_args(1) << std::endl; // false
std::cout << even_number_of_args(1, "two") << std::endl; // true
std::cout << even_number_of_args(1, "two", 3.0) << std::endl; // false
std::cout << even_number_of_args(1, "two", 3.0, '4') …Run Code Online (Sandbox Code Playgroud) 是否有可能在生锈中编写一个创建其他宏的宏.例如,假设我定义了以下两个宏:
macro_rules! myprint(
($a:expr) => (print!("{}", $a))
)
macro_rules! myprintln(
($a:expr) => (println!("{}", $a))
)
Run Code Online (Sandbox Code Playgroud)
由于这两个宏重复了很多代码,我可能想编写一个宏来生成宏.
我试图生成这样一个元宏.
#![feature(macro_rules)]
macro_rules! metamacro(
($i:ident) => (
macro_rules! $i (
($a:expr) => ({println!("hello {}", $a)})
)
);
)
metamacro!(foo)
fn main() {
foo!(1i);
}
Run Code Online (Sandbox Code Playgroud)
但得到以下错误:
<anon>:6:13: 6:14 error: unknown macro variable `a`
<anon>:6 ($a:expr) => ({println!("hello {}", $a)})
^
playpen: application terminated with error code 101
Program ended.
Run Code Online (Sandbox Code Playgroud)
编辑:在更多地使用宏之后,我发现如果返回的宏没有收到任何参数,则更高阶的宏按预期工作.例如,以下代码
#![feature(macro_rules)]
macro_rules! metamacro(
($i:ident) => (
macro_rules! $i (
() => …Run Code Online (Sandbox Code Playgroud) 我试图在生锈中重载右移位运算符(>>)以实现Maybe绑定.
enum Maybe<T> {
Nothing,
Just(T)
}
/// Maybe bind. For example:
///
/// ```
/// Just(1) >> |x| Just(1 + x) >> |x| Just(x * 2)
/// ```
impl<'a, T, U> Shr<|&T|: 'a -> Maybe<U>, Maybe<U>> for Maybe<T> {
fn shr(&self, f: &|&T| -> Maybe<U>) -> Maybe<U> {
match *self {
Nothing => Nothing,
Just(ref x) => (*f)(x)
}
}
}
fn main() {}
Run Code Online (Sandbox Code Playgroud)
但是,我在尝试调用闭包时遇到错误:
<anon>:15:28: 15:32 error: closure invocation in a `&` …Run Code Online (Sandbox Code Playgroud)