【发布时间】:2019-04-09 01:13:17
【问题描述】:
假设我有 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也许我走错了路,但我不确定。
【问题讨论】:
-
要在编译时选择模板中的内容,您需要
if constexpr。但是你不能检查像choice这样的东西,因为它是一个运行时参数。 -
所以
using是在编译时而不是运行时应用的东西? -
是的。
using有多种不同的用途,但它们都是编译时的东西。