使用std :: enable_if有什么问题?

炸药

我有一个函数set_data,必须针对接收的不同类型以不同的方式实现。例如,这正尝试基于输入类型实现两个重载。如果它是基本的,nonvoid和non nullptr_t,则在第一个实现中处理它。如果它是std::stringchar缓冲区,请以其他方式处理。

struct field
{
    template<typename TDataType, typename=void>
    void set_data(TDataType data, size_t index = 0);
};

template<typename TDataType, typename = typename
        std::enable_if< std::is_fundamental<TDataType>::value &&
                        std::is_same<TDataType, nullptr_t>::value == false &&
                        std::is_same<TDataType, void>::value == false>::type>
void field::set_data(TDataType data, size_t index /* = 0 */)
{
}

template<typename TDataType, typename = typename
        std::enable_if< std::is_same<std::string const &, TDataType> ||
                        std::is_same<char const *, TDataType>>::type>
void field::set_data(TDataType data, size_t index /* = 0 */)
{
}

然后我打电话说:

field f;
int x = 10;
f.set_data(x);

编译器向我抛出错误。

defs.h(111): error C2995: 'void messaging::field::set_data(TDataType,size_t)' : function template has already been defined

我该如何解决?

在Visual Studio 2013上

特里斯坦·布林德尔

在这样的模板参数上使用SFINAE无法正常工作,以为我不确定100%为何会这样(编辑: Agnew的回答说明这是因为模板无法区分)。如果改用std::enable_if返回类型,并在类中移动定义,则它可以工作(已通过gcc和clang测试):

struct field
{
    template<typename TDataType>
    void set_data(TDataType data, size_t index = 0) {}

    template<typename TDataType>
    typename std::enable_if<std::is_fundamental<TDataType>::value &&
                            !std::is_same<TDataType, std::nullptr_t>::value &&
                            !std::is_same<TDataType, void>::value,
                            void>::type
    set_data(TDataType data, size_t index /* = 0 */)
    {
    }

    template<typename TDataType>
    typename std::enable_if<std::is_same<std::string const &, TDataType>::value ||
                            std::is_same<char const *, TDataType>::value,
                            void>::type
    set_data(TDataType data, size_t index /* = 0 */)
    {
    }

};

(我还修复了一些其他错误,即不要求int第二次重载value成员std::is_same,并且不指定的名称空间std::nullptr_t)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用std :: enable_if

来自分类Dev

我的execvp使用有什么问题?

来自分类Dev

我使用setSelectionRange有什么问题?

来自分类Dev

使用BeanFactoryAnnotationUtils有什么问题?

来自分类Dev

使用sudo有什么问题?

来自分类Dev

重定向的使用有什么问题?

来自分类Dev

使用“ forEach”有什么问题?

来自分类Dev

我使用grep有什么问题?

来自分类Dev

我使用 ReentrantReadWriteLock 有什么问题?

来自分类Dev

std :: enable_if和std :: enable_if_t有什么区别?

来自分类Dev

这段代码中std :: remove_if有什么问题

来自分类Dev

在std :: enable_if中使用sizeof ...

来自分类Dev

std :: enable_if的第二个参数有什么用?

来自分类Dev

对于类模板,std :: enable_if优于static_assert有什么优势?

来自分类Dev

使用enable_if的多个重载问题

来自分类Dev

使用智能指针有什么问题?

来自分类Dev

C ++使用toString()方法有什么问题

来自分类Dev

不使用单例模式有什么问题

来自分类Dev

使用ContinuationMonad的100000阶乘有什么问题?

来自分类Dev

C-这样使用malloc有什么问题?

来自分类Dev

使用TThread.Resume有什么问题?

来自分类Dev

使用此XML元素有什么问题?

来自分类Dev

在自己的构造中使用对象有什么问题吗?

来自分类Dev

C ++使用toString()方法有什么问题

来自分类Dev

对家长活动使用静态有什么问题?

来自分类Dev

我使用strchr的代码有什么问题

来自分类Dev

使用GDB'find'命令有什么问题?

来自分类Dev

此SQL(使用IN的子查询)有什么问题?

来自分类Dev

授予使用sudo vim的权利有什么问题?