说我有N
函数,它们具有一组相同的参数。我调用带有参数的工厂方法和一些允许我在N
函数之间进行选择的值。
一种不整洁的方法是执行以下if语句:
if(choice == 1)
foo_one<T>(args);
else if (choice == 2)
foo_two<T>(args);
etc
很好,除非在我的情况下参数数量很大。因此,工厂方法非常拥挤。
假设我有一个主要函数调用工厂方法:
int main(int argc, char *argv[])
{
int choice = 1;
float arg = 1.5;
foo_choose(choice, arg);
return 0;
}
我正在考虑分支
choice
参数,并在那if语句设置函数别名。这意味着无论
N
有多大,我只需传递一次参数。它可能看起来像这样:
template <typename T>
void foo_one(T arg) { std::cout << "foo_one\n"; };
template <typename T>
void foo_two(T arg) { std::cout << "foo_one\n"; };
template <typename T>
void foo_choose(int choice, T arg)
{
if(choice == 1)
using foo = foo_one<T>;
else
using foo = foo_two<T>;
foo(arg);
};
但是,我无法使它与模板一起使用。有什么明显的我想念的东西,或者我应该添加一个搜索词。
由于我可能用不同的值为
foo_choose
多次调用choice
,因此我不希望别名foo
存在于函数范围之外。This question suggests也许我走错了路,但是我不确定。
最佳答案
问题所在
template <typename T>
void foo_choose(int choice, T arg)
{
if(choice == 1)
using foo = foo_one<T>;
else
using foo = foo_two<T>;
foo(arg);
};
是using语句是作用域语句。这意味着它们仅适用于声明的作用域,因此,一旦进入
foo(arg);
,foo
就超出作用域,并且会出现错误。您可以获取指向该函数的指针,而不是获取该函数的别名,然后在最后调用该指针。那团糟看起来像template <typename T>
void foo_choose(int choice, T arg)
{
using f_ptr = void(*)(T);
f_ptr foo;
if(choice == 1)
foo = foo_one<T>;
else
foo = foo_two<T>;
foo(arg);
};
注意,您必须指定所有功能模板参数。
关于c++ - 模板函数范围内的条件模板类型别名,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55577889/