将模板函数指针作为模板参数传递给模板过于冗长

Vit*_*meo 6 c++ parameters templates function-pointers c++11

template<class T, class... TA> Uptr<T, TA> makeUniquePtr(/*...*/) { /*...*/ };
template<class T, class... TA> Sptr<T, TA> makeSharedPtr(/*...*/) { /*...*/ };

template<typename TFPType, TFPType TFP> void func(/*...*/) { /*...*/ }

template<class T, class... TA> void implementation1(/*...*/)
{
    // Can this be reduced to func<&makeUniquePtr, T, TA...>?
    func<decltype(&makeUniquePtr<T, TA...>), &makeUniquePtr<T, TA...>>(/*...*/);
}

template<class T, class... TA> void implementation2(/*...*/)
{
    // Can this be reduced to func<&makeSharedPtr, T, TA...>?
    func<decltype(&makeSharedPtr<T, TA...>), &makeSharedPtr<T, TA...>>(/*...*/);
}
Run Code Online (Sandbox Code Playgroud)

通话func</*...*/>(/*...*/)非常冗长.有没有办法简单地打电话

func<&makeSharedPtr, T, TA...>(/*...*/)
Run Code Online (Sandbox Code Playgroud)

并在内部使用

&makeSharedPtr<T, TA...>
Run Code Online (Sandbox Code Playgroud)

没有用户指定它两次?

Yak*_*ont 4

创建一个共享制造商无状态函数对象类,例如std::less,但本身没有template参数:而是operator()完美转发到您的template函数。

传递它而不是函数指针。

如果您需要template传递给它的参数,请static为其创建一个方法,或者使整个方法template class接受参数并在operator().

这是后期绑定template参数的示例(实时示例):

#include <iostream>

// test stubs:
template<typename... Ts>
using UPtr = int;
template<typename... Ts>
using SPtr = double;

template<typename T, typename...TA>
UPtr<T,TA...> makeUniquePtr() {
  std::cout << "makeUniquePtr\n";
  return {};
}
template<typename T, typename...TA>
SPtr<T,TA...> makeSharedPtr() {
  std::cout << "makeSharedPtr\n";
  return {};
}

// perfect forwarding make static functions passed by class name:
struct unique_ptr_maker {
  template<typename T, typename...TA, typename...Args>
  static UPtr<T, TA...> make(Args&&...args) {
    return makeUniquePtr<T, TA...>( std::forward<Args>(args)... );
  }
};
struct shared_ptr_maker {
  template<typename T, typename...TA, typename...Args>
  static SPtr<T, TA...> make(Args&&...args) {
    return makeSharedPtr<T, TA...>( std::forward<Args>(args)... );
  }
};

// your `func`.  It can take args or whatever:    
template<typename maker, class T, class... TA> void func() {
  std::cout << "func\n";
  maker::template make<T, TA...>();
}

// a sample of implementation 1 and 2:
template<class T, class... TA> void implementation1()
{
  func<unique_ptr_maker, T, TA...>();
}
template<class T, class... TA> void implementation2()
{
  func<shared_ptr_maker, T, TA...>();
}
// and, to test, always instantiate:
int main() {
  implementation1<int, double>();
  implementation2<int, char>();
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

由于您没有详细说明问题中应该做什么,因此许多功能都被删除了。