标签: parameter-pack

在模板参数包上使用类型特征?

在下面的示例代码中,我试图检查函数参数是否是指针 std::is_pointer

如果只有一个参数它工作得很好,但是如何使它与更多参数一起工作,例如在参数包中?

#include <type_traits>
#include <iostream>

class Test
{
public:
    template<typename... Params>
    void f(Params... params);

    template<typename T, typename... Params>
    auto sum(T arg, Params... params)
    {
        return arg + sum(params...);
    }

    template<typename T>
    auto sum(T arg)
    {
        return arg;
    }

    int member = 1;
};

template<typename... Params>
void Test::f(Params... params)
{
    // ERROR: too many template arguments for std::is_pointer
    if constexpr (std::is_pointer_v<Params...>)
        member += sum(*params...);
    else
        member += sum(params...);

    std::cout << member;
}

int main()
{
    Test ts;

    // both …
Run Code Online (Sandbox Code Playgroud)

c++ templates type-traits c++17 parameter-pack

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

enable_if 中参数包的 sizeof... 问题

以下示例在所有主要编译器中均失败:clanggccvisual studio

我想知道它出了什么问题,看起来很简单:

如果sizeof...(TYPES) == 2那么它应该排除一个重载并接受另一个重载,如果0、1或大于2那么它应该接受第一个重载并排除第二个重载。

为什么这行不通呢?

#include <iostream>
#include <type_traits>

template <typename... TYPES>
struct Test {
    template <std::enable_if_t<(sizeof...(TYPES) != 2), int> = 0>
    Test() {
        std::cout << "A\n";
    }

    template <std::enable_if_t<(sizeof...(TYPES) == 2), int> = 0>
    Test() {
        std::cout << "B\n";
    }
};

int
main() {

    Test<int, int> t1;
    Test<int, int, int> t2;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

clang错误:

In file included from C:\Users\joaopires\Dropbox\++A\tests\par_pack.cpp:1:
In file included from C:\Program Files (x86)\Microsoft Visual …
Run Code Online (Sandbox Code Playgroud)

c++ sizeof enable-if variadic-templates parameter-pack

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

遍历 std::initializer_list

//parameter pack sum example

constexpr int sum(int N= 0)
{
    return N;
}
template<typename ...Args>
constexpr int sum(int first, int second, Args ...N)
{
    return first + second + sum(N...);
}

int main()
{
    std::cout << sum<int>(1,6,3);
}
Run Code Online (Sandbox Code Playgroud)

是否有可能在编译时通过std::initializer_list<int>我如何递归迭代来计算这个总和。

c++ metaprogramming initializer-list c++11 parameter-pack

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

关于c++模板和参数包

template<class... Cs>
void func(Cs... cs){
};
template<class T, class... Cs>

void func1(T s){

    func<Cs...>(/* the problem */);
};

int main(){
    char s[]="HI THERE!";
    func1<char*,char,char,char>(s);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

因此 func1() 调用 func(),这两个函数由相同的模板参数包专门化,函数 func1() 采用已知参数“s”,我们假设它可以生成并提供从该参数值s到func() ,但我们怎样才能做到这一点。

这个问题对我来说很难解释,我希望你明白这一点。

编辑:可以说,遵循此模式func1()传递的参数实际上取决于参数包func()s[0],s[1],...

c++ templates parameter-pack

0
推荐指数
1
解决办法
156
查看次数

如何将函数名称和参数的可变参数列表传递给 C++ 中的函数?

不是What is std::invoke in c++?的重复项 。该问题专门询问了这一唯一的功能。这个问题询问一个概念,无需该功能即可 100% 解决,并且有多种替代解决方案,其中只有一些甚至使用该功能。


在 Python 中,您可以将函数名称和参数列表传递给外部函数,该外部函数调用内部函数并将这些参数传递给它,如下所示:

在Python中将带有参数的函数传递给另一个函数?

def perform(fun, *args):
    fun(*args)

def action1(args):
    # something

def action2(args):
    # something

perform(action1)
perform(action2, p)
perform(action3, p, r)
Run Code Online (Sandbox Code Playgroud)

我如何在 C++ 中做到这一点?

c++ variadic variadic-templates parameter-pack

0
推荐指数
1
解决办法
1070
查看次数

是否可以迭代 Swift 参数包的参数?

参数包是 Swift 5.9 的一个很酷的新功能,但令人惊讶的是,似乎没有太多关于它们的讨论,而且我也没有在 StackOverflow 上看到这个问题的答案。

swift parameter-pack

0
推荐指数
1
解决办法
412
查看次数