Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/135.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;typedef重命名函数_C++_Function_Templates_Typedef_Template Meta Programming - Fatal编程技术网

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>();