我可以为静态成员函数模板使用别名吗?

时间:2015-02-27 21:15:01

标签: c++11

使用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?) 但似乎并不涵盖功能模板的情况。

2 个答案:

答案 0 :(得分:4)

当然,如果您想先使用using关键字做一些工作,可以为模板化功能设置别名:

template<typename T>
using testfn = bool (*)(T);

然后使用以下命令创建指向该函数的指针:

testfn<int> fnPointer = Test::Function;

最后称之为:

std::cout << boolalpha << fnPointer(x) << std::endl;

Live Demo

如果您只想绑定Tint的情况,您可以这样做:

using testfn = bool (*)(int);
//...
testfn fnPointer = Test::Function;
std::cout << boolalpha << fnPointer(x) << std::endl;

Live Demo 2

修改:如果您想要一个constexpr函数指针,就像您所链接的问题的已接受答案一样,这是一个非常简单的扩展:

constexpr auto yourFunction = &Test::Function<int>;
//...
std::cout << boolalpha << yourFunction(x) << std::endl;

Live Demo 3

答案 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); };

full example

此外,内联完整示例:

#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;
}