gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:34:35 26 4
gpt4 key购买 nike

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...>>(/*...*/);
}

调用 func</*...*/>(/*...*/)非常冗长。有没有办法简单地调用

func<&makeSharedPtr, T, TA...>(/*...*/)

并在内部使用

&makeSharedPtr<T, TA...>

无需用户指定两次?

最佳答案

创建一个共享的 maker 无状态函数对象类,如 std::less,但本身没有 template 参数:取而代之的是 operator()完美转发到您的模板函数。

传递它而不是你的函数指针。

如果你需要传递给它的模板参数,要么为它创建一个static方法,要么让整个模板类接受参数并在 operator() 中使用它们。

这是后期绑定(bind) template 参数 ( live example ) 的示例:

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

很多功能都被删除了,因为您没有详细说明它在您的问题中应该做什么。

关于c++ - 将模板函数指针作为模板参数传递给模板过于冗长,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23931164/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com