GCC因可变参数模板和指向成员函数的指针而失败

塞巴斯蒂安·查普伊斯
#include <memory>
#include <iostream>

class           Manager
{
public:
  Manager() {}
  virtual ~Manager() {}

  int funcA(std::shared_ptr<int> a, float b) { return *a + b; }
  int funcA(std::shared_ptr<double> a) { return *a; }
};

template <typename T, typename... Args>
auto resolver(int (Manager::*func)(std::shared_ptr<T>, Args...)) -> decltype(func) {
  return func;
}                                                                                                                                  

int main(int, char **)
{
  Manager m;
  Manager *ptr = &m;

  auto var = std::make_shared<int>(1);

  int result = (ptr->*resolver<int>(&Manager::funcA))(var, 2.0);

  std::cout << result << std::endl;

  return 0;
}

此代码无法使用gcc进行编译,但可以使用clang进行编译。(gcc 5.3.1和6.0.0 20151220)。

您是否知道是否有任何解决方案可以使用gcc进行编译?我尝试使用模板专门化和显式实例化。

编辑:gcc给出以下错误:

test > g++ -std=c++11 test.cpp 
test.cpp: In function 'int main(int, char**)':
test.cpp:29:52: error: no matching function for call to 'resolver(<unresolved overloaded function type>)'
   int result = (ptr->*resolver<int>(&Manager::funcA))(var, 2.0);
                                                    ^
test.cpp:15:6: note: candidate: template<class T, class ... Args> decltype (func) resolver(int (Manager::*)(std::shared_ptr<_Tp1>, Args ...))
 auto resolver(int (Manager::*func)(std::shared_ptr<T>, Args...)) -> decltype(func) {
      ^
test.cpp:15:6: note:   template argument deduction/substitution failed:
test.cpp:29:52: note:   mismatched types 'std::shared_ptr<int>' and 'std::shared_ptr<double>'
   int result = (ptr->*resolver<int>(&Manager::funcA))(var, 2.0);
                                                    ^
test.cpp:29:52: note:   could not resolve address from overloaded function '& Manager::funcA'
test > 
贾罗德42

作为解决方法,您可以使用

template <typename T>
struct resolver
{
    template <typename... Args>
    auto operator ()(int (Manager::*func)(std::shared_ptr<T>, Args...)) -> decltype(func) {
      return func;
    }
};

像电话一样

(ptr->*resolver<int>{}(&Manager::funcA))(var, 2.0);

注意额外{}的调用构造函数。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

可变参数函数模板接受任何指针(指向变量,函数,成员函数等)作为参数

以成员函数指针为参数的可变参数模板

使用可变参数模板(gcc,clang)的成员函数指针包装器

具有可变参数模板的成员函数指针

g ++和clang ++的行为不同,指向可变参数模板函数的指针

用于评估指向成员的指针的 C++ 可变参数模板

可变参数模板函数重载失败

C ++:具有可变参数模板的成员函数指针参数

可变参数模板类-可变参数成员函数

为什么可变参数模板参数推导对此函数指针失败?

使用可变参数模板将指针传递给成员

函数指针参数的可变参数模板参数推导

完美转发可变参数模板参数到成员函数

如何在SWIG中包装可变参数模板类的可变参数模板成员函数?

使用成员函数调用可变参数模板函数

具有可变参数模板参数的函数指针

可变参数模板函数确定函数指针的返回类型

可变参数函数和可变参数模板重载查找

为什么模板参数推导因std :: function回调的可变参数模板参数而失败?

推导可变参数模板函数的参数失败

专业化可变参数模板成员函数

std::invoke 不喜欢可变参数模板成员函数?

可变参数模板成员函数的部分专业化

std :: bind与可变参数模板成员函数和通用引用

用可变参数模板在C ++中包装函数指针

可变参数模板和函数的指针:哪种编译器正确?

使用可变参数模板和函数指针的简单EventHandler / Provider

指向成员的变量参数模板参数

调用可变参数模板函数而无args失败