小编mwh*_*ker的帖子

是否有可能编写一个函数模板来返回参数的数量是否可以被N整除?

我一直在学习可变参数模板,在这篇优秀博客文章的帮助下,我设法编写了一个函数模板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)

c++ variadic-templates c++11

46
推荐指数
2
解决办法
3464
查看次数

高阶宏

是否有可能在生锈中编写一个创建其他宏的宏.例如,假设我定义了以下两个宏:

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)

rust

11
推荐指数
1
解决办法
2568
查看次数

Rust Shr操作员

我试图在生锈中重载右移位运算符(>>)以实现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)

rust

5
推荐指数
1
解决办法
490
查看次数

标签 统计

rust ×2

c++ ×1

c++11 ×1

variadic-templates ×1