C++ 指向具有默认参数的函数的指针

C++ 指向具有默认参数的函数的指针,c++,c++14,C++,C++14,假设我们有一个函数 int foo (std::string, size_t = 0) { return 42; } 我想用包装器函数调用这个函数 template <typename T> auto boo (std::string s) { return (*T::value) (s); } 现在的用法是这样的 struct Foo : std::integral_constant<int (*) (std::string, size_t), &foo&

假设我们有一个函数

int foo (std::string, size_t = 0) { return 42; }
我想用包装器函数调用这个函数

template <typename T>
auto boo (std::string s) {
    return (*T::value) (s);
}
现在的用法是这样的

struct Foo : std::integral_constant<int (*) (std::string, size_t), &foo> {};
std::cout << boo<Foo> ("b") << "\n"; // 42
就我而言,如果我使用指向没有包装器模板函数的函数的指针

using Ptr = int (*) (std::string, size_t);
Ptr p = &foo;
auto x = p ("10");
然后,在所有提到的GCC版本中都会出现错误

根据后一个示例,这是否意味着即使指向的函数不需要第二个参数,我也不能在不明确指定第二个参数的情况下使用指针?


根据主要示例,这是否意味着GCC 5.3.1在与模板包装器相关的情况下错误地实现了此行为?

使用带有默认参数的函数使用其任何可能的签名都可以,但您自己也引入了不一致性。您已经将
Foo
明确定义为包装一个指向两个参数函数的指针,因此最好使用两个参数调用它。如果要使用一个参数调用它,请将其用作指向一个参数函数的指针


我不知道你想用积分常数实现什么。

可能重复“就我而言,如果我使用指向函数的指针”,你是否错过了“那么X应该发生”?std::积分常数用于在函数的值成员中存储指向函数的指针。不,我明白了。我只是不知道你为什么不喜欢只使用函数指针。通常,
integral\u constant
用于某些编译时分派技巧(如元组长度),但这些技巧实际上并不适用于函数指针。
using Ptr = int (*) (std::string, size_t);
Ptr p = &foo;
auto x = p ("10");