使用C ++ 11,我想调用一个静态成员函数模板,而不用它的封闭类的范围限定它:
struct Test {
template<typename T>
static bool Function(T x)
{ /* ... */ }
};
int x;
Test::Function(x); // I don't want to write this
Function(x); // I want to be able to write this instead
我可以在全局范围内定义具有相同签名的另一个函数并转发参数,但我更喜欢不强迫我编写另一个函数的解决方案。我也想避免使用宏。
这个问题是相关的: (using alias for static member functions?) 但似乎并不涵盖功能模板的情况。
答案 0 :(得分:4)
当然,如果您想先使用using
关键字做一些工作,可以为模板化功能设置别名:
template<typename T>
using testfn = bool (*)(T);
然后使用以下命令创建指向该函数的指针:
testfn<int> fnPointer = Test::Function;
最后称之为:
std::cout << boolalpha << fnPointer(x) << std::endl;
如果您只想绑定T
为int
的情况,您可以这样做:
using testfn = bool (*)(int);
//...
testfn fnPointer = Test::Function;
std::cout << boolalpha << fnPointer(x) << std::endl;
修改:如果您想要一个constexpr
函数指针,就像您所链接的问题的已接受答案一样,这是一个非常简单的扩展:
constexpr auto yourFunction = &Test::Function<int>;
//...
std::cout << boolalpha << yourFunction(x) << std::endl;
答案 1 :(得分:0)
我学会了使用@andyg答案(可能在我的上面),但是它对我有用,不需要为每个模板都放置不同的别名。
它需要c ++ 14 或更高版本。
第1步-神奇的模板别名:
template <typename T> constexpr auto funky1 = &Test::Function<T>;
第2步-lambda表示您无需传递模板参数:
auto funky = [](auto in) { return funky1<decltype(in)>(in); };
此外,内联完整示例:
#include <iostream>
struct Test {
template <typename T> static bool Function(T x) { return true; }
};
// Magical template alias
template <typename T> constexpr auto funky1 = &Test::Function<T>;
// lambda means it'll infer the template parameters when calling
auto funky = [](auto in) { return funky1<decltype(in)>(in); };
int main() {
int x = 0;
// Just use the `funky1` version, but you have to specify the template parameters
std::cout << "string: " << funky1<std::string>("I'm a string") << std::endl
<< "int: " << funky1<int>(42) << std::endl
<< "bool: " << funky1<bool>(true) << std::endl;
// Use the `funky` version, where template parameters are inferred
std::cout << "string: " << funky("I'm a string") << std::endl
<< "int: " << funky(42) << std::endl
<< "bool: " << funky(true) << std::endl;
return 0;
}