提问人:Tharani B 提问时间:1/24/2023 更新时间:1/24/2023 访问量:123
如何将 pimpl 成语与模板化函数一起使用
How to use pimpl idiom with templated functions
问:
我有一个具有模板成员函数的类,私有成员需要通过 pimpl idiom 方法放入实现类中。
Foo.hpp的
#include <iostream>
class Foo
{
public:
private:
class FooImpl;
std::unique_ptr<FooImpl> impl_;
public:
Foo() = default;
template <class F, class... Args>
auto SomeFunction ( F &&f, Args &&...args) -> boost::unique_future<decltype (f(args...))>;
};
Foo.cpp
#include <Foo.hpp>
#include <FooImpl.hpp>
template <class... Args>
template <class F, class... Args>
auto SomeFunction ( F &&f, Args &&...args) -> boost::unique_future<decltype (f(args...))>
{
impl->SomeFunction(std::forward<F>(f),std::forward<Args>(args)...);
}
FooImpl.hpp
#include <Foo.hpp>
class Foo::FooImpl
{
public:
FooImpl() = default;
template <class F, class... Args>
auto SomeFunction ( F &&f, Args &&...args) -> boost::unique_future<decltype (f(args...))>;
private:
int dummy;
};
FooImpl.cpp
#include <FooImpl.hpp>
template <class... Args>
template <class F, class... Args>
auto SomeFunction ( F &&f, Args &&...args) -> boost::unique_future<decltype (f(args...))>
{
//Do Something...
}
我尝试了以下方法,但在我的情况下没有任何效果:-
- 具有虚拟功能。这不起作用,因为虚拟函数无法模板化。
- 显式实例化所有模板实例,例如
template class Foo<int>;
template class Foo<float>;
这不适合我的情况,因为任何类型都可以出现在我的函数中。我无法显式实例化所有类型。
还有其他方法吗?是否可以使用模板函数实现 pimpl 成语?或者除了疙瘩成语之外还有其他选择吗?
答: 暂无答案
评论
Foo
FooImpl
std::any
std::function