可变参数模板函数重载
Variadic template function overloading
我有一个 class 带有可变参数模板成员函数 (foo),如下所示。这个想法是跳过参数中的所有双精度数并使用用户提供的参数分配一个对象。
template <class T>
class Var {
public:
template <typename U, typename ...Args>
int foo(int index, Args... args)
{
T* p = new U(args...);
// save in an array at index 'index'
}
template <typename U, typename ...Args>
int foo (double index, Args... args)
{
// do something with index and skip it
return foo<U>(args...);
}
};
class A {
public:
A (int i, const char *p)
{
}
};
int main ()
{
Var<A> var;
var.foo<A>(1.0, 2, 3, "Okay");
}
现在可以了,有两个问题。
强制skip.Eg有多少双打:跳过2个双打,然后下一个参数应该是一个整数。如果不是,则抛出错误。
同时,使用 'int' 代替 'double'。所以我们将跳过 2 个整数。下一个索引将是数组的 'index'。
基本上我想通过no。作为 class 模板参数跳过的整数。
template <class T, int SKIP>
class Var {
并使用 SKIP 确定要跳过多少个整数。
是否可以这样做?
为了您的 SKIP
目标,您可以这样做:
template <typename U, typename ...Args>
int foo(Args ...args) {
return foo_helper<U, 0>(std::forward(args));
}
template <typename U, int I, typename ...Args>
int foo_helper(int index, Args ...args) {
return foo_helper<U, I+1>(std::forward(args));
}
template <typename U, typename ...Args>
int foo_helper<U, SKIP, Args...>(int index, Args ...args) {
blah = new U(std::forward(args));
return foobar;
}
基本上,要有计算目标的方法,并在达到目标之前去除参数。对目标值进行特化。
此外,并不是说您可能想要 forward
参数来保留引用等
我相信 C++14 可能会让其中的一些变得更容易,但我对新的模板元编程技术还不够熟悉,无法解决这个问题。
这就是我从 Novelocrat 那里得到的提示。顺便贴一下,留作记录。
template <class T, int SKIP>
class FooHelper {
public:
template <typename U, typename ...Args>
static int foo_helper(int index, Args... args)
{
FooHelper<T, SKIP-1>::foo_helper<U>(args...);
return 0;
}
};
template <class T>
class FooHelper<T, 0> {
public:
template <typename U, typename ...Args>
static int foo_helper (Args... args)
{
auto p = new U(args...);
return 0;
}
};
template <class T, int SKIP>
class Var {
public:
template <typename U, typename ...Args>
int foo(Args ...args)
{
FooHelper<T, SKIP>::foo_helper<U>(args...);
return 0;
}
};
我有一个 class 带有可变参数模板成员函数 (foo),如下所示。这个想法是跳过参数中的所有双精度数并使用用户提供的参数分配一个对象。
template <class T>
class Var {
public:
template <typename U, typename ...Args>
int foo(int index, Args... args)
{
T* p = new U(args...);
// save in an array at index 'index'
}
template <typename U, typename ...Args>
int foo (double index, Args... args)
{
// do something with index and skip it
return foo<U>(args...);
}
};
class A {
public:
A (int i, const char *p)
{
}
};
int main ()
{
Var<A> var;
var.foo<A>(1.0, 2, 3, "Okay");
}
现在可以了,有两个问题。
强制skip.Eg有多少双打:跳过2个双打,然后下一个参数应该是一个整数。如果不是,则抛出错误。
同时,使用 'int' 代替 'double'。所以我们将跳过 2 个整数。下一个索引将是数组的 'index'。
基本上我想通过no。作为 class 模板参数跳过的整数。
template <class T, int SKIP>
class Var {
并使用 SKIP 确定要跳过多少个整数。
是否可以这样做?
为了您的 SKIP
目标,您可以这样做:
template <typename U, typename ...Args>
int foo(Args ...args) {
return foo_helper<U, 0>(std::forward(args));
}
template <typename U, int I, typename ...Args>
int foo_helper(int index, Args ...args) {
return foo_helper<U, I+1>(std::forward(args));
}
template <typename U, typename ...Args>
int foo_helper<U, SKIP, Args...>(int index, Args ...args) {
blah = new U(std::forward(args));
return foobar;
}
基本上,要有计算目标的方法,并在达到目标之前去除参数。对目标值进行特化。
此外,并不是说您可能想要 forward
参数来保留引用等
我相信 C++14 可能会让其中的一些变得更容易,但我对新的模板元编程技术还不够熟悉,无法解决这个问题。
这就是我从 Novelocrat 那里得到的提示。顺便贴一下,留作记录。
template <class T, int SKIP>
class FooHelper {
public:
template <typename U, typename ...Args>
static int foo_helper(int index, Args... args)
{
FooHelper<T, SKIP-1>::foo_helper<U>(args...);
return 0;
}
};
template <class T>
class FooHelper<T, 0> {
public:
template <typename U, typename ...Args>
static int foo_helper (Args... args)
{
auto p = new U(args...);
return 0;
}
};
template <class T, int SKIP>
class Var {
public:
template <typename U, typename ...Args>
int foo(Args ...args)
{
FooHelper<T, SKIP>::foo_helper<U>(args...);
return 0;
}
};