C++ C++;typedef重命名函数
我希望能够C++ C++;typedef重命名函数,c++,function,templates,typedef,template-meta-programming,C++,Function,Templates,Typedef,Template Meta Programming,我希望能够typedef函数,以便能够将模板元编程用作函数选择器(如下面的示例中所示)。我还尝试将函数作为模板参数传递。在这两种情况下都会出现错误,因为函数不是类型。我知道如果它们是函子,这两种方法中的任何一种都会起作用,但我希望能够有一个通解 有没有一种真正的方法可以“使用不同的名称来使用”typedeffunctions”,我只是不知道 编辑: 此时我的用例是,我希望能够在使用boost::property\u tree::xml\u parser::read\u xml和boost::pr
typedef
函数,以便能够将模板元编程用作函数选择器(如下面的示例中所示)。我还尝试将函数作为模板参数传递。在这两种情况下都会出现错误,因为函数不是类型
。我知道如果它们是函子,这两种方法中的任何一种都会起作用,但我希望能够有一个通解
有没有一种真正的方法可以“使用不同的名称来使用”typedef
functions”,我只是不知道
编辑:
此时我的用例是,我希望能够在使用boost::property\u tree::xml\u parser::read\u xml
和boost::property\u tree::json\u parser::read\u json
之间进行选择。但它不仅限于这种情况,使用成员函数、函数指针或std::function
将需要找到并复制所有精确的函数定义,以正确创建选择器
void foo1() { /*do stuff*/ }
void foo2() { /*do other stuff*/ }
template <bool SELECT>
struct Selector {
typedef foo1 foo;
};
template <>
struct Selector<false> {
typedef foo2 foo;
};
描述用例的一种更一般的方法是使用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;
};
void foo1(){/*do stuff*/}
void foo2(){/*执行其他操作*/}
模板
结构选择器{
类型def foo 1 foo;
};
模板
结构选择器{
类型def foo 2 foo;
};
我假设您的目标只是根据一些bool
选择函数。您可以使用成员函数轻松完成此操作:
template <bool select>
struct selector {
void operator () () {foo1();}
};
template <>
struct selector <false> {
void operator () () {foo2();}
};
模板
结构选择器{
void运算符(){foo1();}
};
模板
结构选择器{
void运算符(){foo2();}
};
当然,您可以使用int
参数和相同的技术在两个以上的函数之间切换。然后,您可以将此struct
作为参数传递给任何需要与foo1
具有相同签名的函数 您可以:
1)使用成员函数
void foo1() { std::cout << "foo1\n"; }
void foo2() { std::cout << "foo2\n"; }
template <bool SELECT>
struct Selector {
void foo() { foo1(); };
};
template <>
struct Selector<false> {
void foo() { foo2(); };
};
int main() {
Selector<true> s1t;
Selector<false> s1f;
s1t.foo();
s1f.foo();
}
还有另外两种解决方案: 1) C++03解决方案:作为类模板成员的常量静态函数指针 3) C++14解决方案:
auto
变量模板
模板
constexpr auto foo=nullptr;
模板
constexpr auto foo=foo1;
模板
constexpr auto foo=foo2;
// ...
foo();
foo();
如果我理解您想要做什么,只需要有一个调用它的成员函数。您可能需要查看std::function和std::bind,因为我认为您实际上并不是在这里寻找类型定义/类型别名。@chris这需要成员函数具有匹配的类型签名。对于boost/STL中的一些重模板化/重载函数来说,这是非常困难的。@JohnSmith,好吧,我想我当时没有抓住要点。一个
typedef
需要一个函数作为一个类型,而它不是-就像2
和“foo”
不是类型一样。谢谢,这会有用的。正如我在评论中提到的,问题在于一些重载Boost/STL函数。什么意思是“问题在于一些重载Boost/STL函数”?。IMHO的std::function
解决方案非常优雅和灵活。无论如何,您应该有一个固定的(或使用默认值的最小值)函数签名来调用它。read_xml就是一个例子。它只有两个重载,但有相当多的参数std::function
或成员函数必须具有正确的函数签名才能正确映射这些签名。请添加所需的示例!要调用函数,必须知道传递参数的签名。或者你需要一个通用的映射(比如Qt-QVariantMap类)@JohnSmith我同意MassimoCosta:你应该通过编辑来重新指定你的问题,可能需要更多的代码和用例,以获得更准确的答案。谢谢,这会有用的。正如我在关于的评论中提到的,问题在于一些重载的Boost/STL函数,C++14
示例单词非常完美。请注意,它也适用于我使用的clang3.4-std=c++11
。只适用于foo1和foo2具有相同签名的情况。要使用foo,您必须知道必须使用哪些参数pass@JohnSmith是的,但是约翰·史密斯说这就是问题所在@约翰史密斯:你可以(C++11)。或(C++03)。
typedef void (*Foo)();
template <bool>
struct Selector
{
static const Foo foo;
};
template <bool select>
const Foo Selector<select>::foo = foo1;
template <>
const Foo Selector<false>::foo = foo2;
// ...
Selector<true>::foo();
Selector<false>::foo();
template <bool>
struct Selector
{
static constexpr auto foo = foo1;
};
template <>
struct Selector<false>
{
static constexpr auto foo = foo2;
};
// ...
Selector<true>::foo();
Selector<false>::foo();
template <bool>
constexpr auto foo = nullptr;
template <>
constexpr auto foo<true> = foo1;
template <>
constexpr auto foo<false> = foo2;
// ...
foo<true>();
foo<false>();