【发布时间】:2014-10-09 13:55:12
【问题描述】:
我希望能够typedef 函数,以便能够将模板元编程用作函数选择器(如下例所示)。我也尝试将函数作为模板参数传递。在这两种情况下都会出现错误,因为函数不是types。我知道如果它们是函子,这些方法中的任何一种都可以工作,但我希望能够有一个通用的解决方案。
是否有“typedef 函数”的实际方法,但名称不同,我只是不知道?
编辑:
此时我的用例是我希望能够在使用 boost::property_tree::xml_parser::read_xml 和 boost::property_tree::json_parser::read_json 之间进行选择。但不仅限于这种情况,使用成员函数、函数指针或std::function 将需要找到所有确切的函数定义并将其复制到正确创建一个选择器。
描述用例的更一般的方法是使用typedef double my_float,以便以后只需一次编辑即可更改所有代码。或者,更高级的是,typedef 可以在元程序选择器中定义。
void foo1() { /*do stuff*/ }
void foo2() { /*do other stuff*/ }
template <bool SELECT>
struct Selector {
typedef foo1 foo;
};
template <>
struct Selector<false> {
typedef foo2 foo;
};
【问题讨论】:
-
如果我理解你想要做什么,只要有一个调用它的成员函数。
-
您可能想查看 std::function 和 std::bind,因为我认为您实际上并不是在这里寻找 typedef / type 别名。
-
@chris 这将要求成员函数具有匹配的类型签名。对于 boost/STL 中的一些重模板化/重载的函数,很难做到正确。
-
@JohnSmith,好吧,我想我没抓住重点。
-
A
typedef需要一个函数是一个类型,但它不是 - 就像2和"foo"不是类型一样。
标签: c++ function templates typedef template-meta-programming