C++ - 是否可以在模板化类的方法中省略 T 类型的参数?

C++ - Possible to omit parameters of type T in the methods of a templated class?

提问人:Anthony Blanchette-Potvin 提问时间:8/13/2023 更新时间:8/13/2023 访问量:42

问:

我有以下模板化类:

template<class A>
class AssetFactory
public:
    virtual std::unique_ptr<Asset> CreateAsset(const AssetDescriptor& assetDescriptor, const A& args) = 0;
};

在 的某些派生类中,我不需要参数,所以我想有一个没有它的变体,使用相同的模板化类,意思是:AssetFactory<A>argsCreateAsset

class DerivedAssetFactory : AssetFactory<???>
public:
    std::unique_ptr<Asset> CreateAsset(const AssetDescriptor& assetDescriptor) override;
};

我目前的解决方案是定义一个模板专用化,用于指示“没有参数的 AssetFactory”,如下所示:void

template<>
class AssetFactory<void>
public:
    virtual std::unique_ptr<Asset> CreateAsset(const AssetDescriptor& assetDescriptor) = 0;
};

然后,如果我的派生类不需要该参数,则可以从中继承。AssetFactory<void>args

我想知道这是否通常是解决我是否应该审查我的设计的问题的方法?

谢谢!

C++ 模板 参数 传递

评论

0赞 Jarod42 8/13/2023
目的是什么?为什么是方法,为什么是模板类?AssetFactory<T>virtual
0赞 Anthony Blanchette-Potvin 8/13/2023
我的工厂存储在一个向量中,并使用 A 的type_index进行标识,我没有在我的帖子中演示过,因为我想尽可能多地消除噪声。我可以做这样的事情,经理会找到相应的工厂并打电话给它。AssetManager.CreateAsset<SomeArgs>({...})CreateAsset<SomeArgs>(args)
3赞 Jarod42 8/13/2023
template<class ... Ts> class AssetFactory可能更合适。所以没有专业化,空包一无所获。
0赞 Anthony Blanchette-Potvin 8/13/2023
谢谢@Jarod42,不知道参数包。这肯定会有用!
2赞 Jarod42 8/13/2023
你可能也会对 std::functiontemplate<class ... Ts> using AssetFactory = std::function<std::unique_ptr<Asset>(const AssetDescriptor&, Ts...)>;

答: 暂无答案