【发布时间】:2020-08-15 02:49:38
【问题描述】:
考虑以下类:
template <typename classTypeT>
class myClass {
public:
using FunctionType1 = std::function<void(classTypeT &, const std::string*)>;
using FunctionType2 = std::function<void(classTypeT &, const int)>;
using FunctionVariantType = boost::variant<FunctionType1, FunctionType2>;
std::vector<FunctionVariantType> myVariants;
myClass(const std::vector<FunctionVariantType> myVec) {
myVariants = myVec;
}
};
并创建该类的实例:
auto vec = std::vector<myClass<SomeOtherClass>::FunctionVariantType>({&SomeOtherClass::someFunc});
auto classInstance = myClass<SomeOtherClass>(vec);
这段代码可以工作并且可以做我想做的事,但我真的很想避免在向量中指定模板类型。即,我希望能够做到这一点:
auto vec = std::vector({&SomeOtherClass::someFunc});
auto classInstance = myClass<SomeOtherClass>(vec); // Error
并且有一些模板推导,但我收到这样的错误:
cannot convert argument 1 from 'std::vector<void (__cdecl myClass::* )(const std::string *),std::allocator<_Ty>>' to 'const std::vector<mwboost::variant<std::function<void (classTypeT &,const std::string *)>,std::function<void (classTypeT &, const int)>>,std::allocator<_Ty>> &'
看起来它不能将函数类型隐式转换为该函数类型的变体?如果没有矢量,这似乎效果更好,但我不应该仍然能够做到这一点吗?
谢谢,
瑞恩
【问题讨论】:
-
在完全隔离的情况下查看
auto vec = std::vector({&SomeOtherClass::someFunc});行。应该如何知道boost::variant和std::function的那行代码会在这里涉及?或者换句话说:如果您是编译器,您会将auto替换为哪种类型?
标签: c++ class templates vector template-argument-deduction