说我有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也许我走错了路,但是我不确定。
答案 0 :(得分:2)
问题
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);
};
这确实带有警告,您必须指定所有功能模板参数。
答案 1 :(得分:1)
如果所有候选对象都是相同类型的函数,则只需设置函数指针的本地数组并从中进行选择:
var messageJson = @"
{
"message":{
"token" : "some device token.........",
"notification" : {
"body" : "Welcome to StackOverflow",
"title" : "Hello Marco",
}
}
}
";
SendFcmNativeNotificationAsync(messageJson);
此处的其他答案已经给出了为什么您的原始方法不起作用的解释。我认为我无法补充……
答案 2 :(得分:0)
无需使用
using foo = foo_one<T>;
跟着
foo(arg);
您最好使用
foo_one(arg);
您已经注意到,使用级联if
/ else
语句是一个维护问题,很容易导致错误。
最好保留一个可用于将调用分派到适当功能的功能/函数映射。但是,对于函数模板,我认为没有明显的通用类型可以用来创建函数/功能映射。
让我们的家中其他人都有正确的想法表明自己可以做到。