比方说,我有这样定义的类FunctionWrapper
:防止隐式转换,但允许列表初始化?
struct FunctionWrapper
{
FunctionWrapper(std::function<void()> f);
// ... plus other members irrelevant to the question
};
我想,以防止隐式转换从std::function<void()>
到FunctionWrapper
,但允许使用大括号初始化语法(即使用列表初始化构建FunctionWrapper
只有一个参数)。换句话说,我想这样:
void foo();
void wrap(FunctionWrapper);
wrap(foo); // (1) error
wrap({foo}); // (2) OK
wrap(FunctionWrapper{foo}); // (3) OK
有没有办法做到这一点?我定义上面的类的方式不是这样的:这允许隐式转换,所以(1)编译。
如果我添加explicit
的构造器:
struct FunctionWrapper
{
explicit FunctionWrapper(std::function<void()> f);
// ... plus other members irrelevant to the question
};
它并没有帮助,因为这云“过犹不及”,并禁止(2)和(1)。
有没有办法实现“中间地带”,并有(2)编译while(1)产生错误?
添加一个采用'std :: initializer_list'参数的显式构造函数。 –
你可以使用initializer_list,但那么你将只有运行时检查参数的数量......也许模板接受常量数组和static_assert模板大小......但只是丑陋 – Hcorg
@Hcorg不会[this](http:///melpon.org/wandbox/permlink/0rFgVYD8XKYwVlC1)需要双括号初始化? –