当前位置: 首页 > 知识库问答 >
问题:

c 03:由于启用了_if,所以采用了互斥方法

孔阳平
2023-03-14

在一个类中,我有两个不同的方法,根据调用者模板参数,它们应该是互斥的。

class Foo
{
    // For collections
    template<class T>
    typename boost::enable_if<boost::is_same<typename std::vector<typename T::value_type>, T>::value, const T&>::type
    doSomething()
    { }


    // For single types
    template<class T>
    typename boost::enable_if<!boost::is_same<typename std::vector<typename T::value_type>, T>::value, const T&>::type
    doSomething()
    { }
}

这不会编译。

错误:“template struct boost::enable_if”的模板参数列表中参数1的类型/值不匹配错误:需要类型,Get'!boost::值是否相同

共有3个答案

邢嘉祯
2023-03-14

一种标签发送怎么样?

#include <vector>
#include <iostream>

template <typename, typename>
struct isSame
 { typedef int type; };

template <typename T>
struct isSame<T, T>
 { typedef long type; };

struct foo
 {
   template <typename T>
   T const & doSomething (T const & t, int)
    { std::cout << "int version" << std::endl; return t; }

   template <typename T>
   T const & doSomething (T const & t, long)
    { std::cout << "long version" << std::endl; return t; }

   template <typename T>
   T const & doSomething (T const & t)
    { return doSomething(t, typename isSame<
        typename std::vector<typename T::value_type>, T>::type()); }
 };

int main ()
 {
   foo f;
   std::vector<int> v;
   f.doSomething(v);   // print "long version"
 }
车胤运
2023-03-14

与std的版本不同,提升::enable_if接受一个类型(布尔值下的一种包装器),所以你应该写一些类似的东西

class Foo
{
    // For collections
    template<class T>
    typename boost::enable_if<
        typename boost::is_same<typename std::vector<typename T::value_type>, T>,
    const T&>::type doSomething()
    { }


    // For single types
    template<class T>
    typename boost::enable_if_с<
        !boost::is_same<typename std::vector<typename T::value_type>, T>::value,
    const T&>::type doSomething()
    { }
}

请注意,我在第一个规范中使用了typename之前的boost::is_same,没有使用::value。相反,我必须在第二个重载中使用启用if_С,因为 运算符不适用于类型。

何超英
2023-03-14

怎么样:

template <typename T> struct is_std_vector : std::false_type {};
template <typename T, typename A>
struct is_std_vector<std::vector<T, A>> : std::true_type {};

然后

class Foo
{
    // For collections
    template<class T>
    typename std::enable_if<is_std_vector<T>::value, const T&>::type
    doSomething();

    // For single types
    template<class T>
    typename std::enable_if<!is_std_vector<T>::value, const T&>::type
    doSomething();
};
 类似资料:
  • 问题内容: 我正在学习Java多线程编程。我有以下逻辑: 假设我有A班 现在,我不需要同步“ someMethod1”或“ someMethod2”中的操作。这意味着,如果有两个线程同时调用“ someMethod1”,则无需序列化这些操作(因为ConcurrentMap将完成此工作)。 但是我希望“ someMethod1”和“ someMethod2”彼此互斥,这意味着当某个线程正在执行“ s

  • 问题内容: 阅读有关锁定PHP的一些文章。 它们主要都直接指向http://php.net/manual/en/function.flock.php。 本页讨论如何在硬盘上打开文件! 真的是这样吗?我的意思是,这使锁定变得非常昂贵-这意味着每次要锁定时,我都必须访问硬盘)= 能再给我一个令人愉快的消息安慰我吗? 编辑: 由于我已经收到了一些答复,我想问这个。 我的脚本只能由一个或多个线程运行?因为

  • 关于采集: 什么是采集呢?我们可以这样理解,我们打开一个网站,看到有一篇文章很不错,于是将文章的标题和内容复制,然后将这篇文章转到我们的网站上,这个过程就可以称作采集,将别人网站上对自己有用的信息转到自己网站上。 采集器也是这样,不过整个过程是由电脑来完成的,我们复制人家的标题和内容,是在知道什么地方是内容,什么地方是标题前提下进行操作的,但电脑是不知道的,所以我们要告诉电脑怎么识别怎么采,这就是

  • 互斥是多线程系统中用于控制访问的一个原对象(primitive object)。下面的例子给出了它最基本的用法: std::mutex m; int sh; //共享数据 // … m.lock(); // 对共享数据进行操作: sh += 1; m.unlock(); 在任何时刻,最多只能有一个线程执行到lock()和unlock()之间的区域(通常称为临界区)。当第一个线程正在临界区执行时

  • 通过作曲家安装照明/数据库失败并生成以下错误: “无法将您的要求解析为一组可安装的程序包。” 问题1-照明/数据库v5。2.0需要照明/支持5.2.*- 照明/支持v5。2.7需要外部mbstring*- 要启用扩展,请验证它们是否正确 在那些地方启用。ini文件:-/etc/php/7.0/cli/php。ini-/etc/php/7.0/cli/conf.d/10-opcache。ini-/e

  • 我正在写一个应用程序,可以在Twitter上发布推文。我想提供在tweet中包含位置的选项,可以通过POST状态/使用lat和long参数进行更新。 我的问题是:如果twitter帐户没有通过https://twitter.com/settings/account“在我的推文中添加位置”,然后我可以发送带有位置信息的推文,但位置信息不会出现。这对用户的安全来说是一件好事,但对我来说是一个烦恼,因为