请考虑以下代码:
template <unsigned int N>
struct myclass
{
unsigned int f() {return N;}
unsigned int g() {static_assert(N > 0, ""); return N-1;}
};
问题: 我是否保证以下代码将编译:
myclass<0> c;
c.f();
但以下情况不会:
myclass<0> c;
c.f();
c.g();
答案 0 :(得分:11)
是的,你有这个保证。从[temp.inst] / 11开始,强调我的:
实现不得隐式实例化函数模板,变量模板,成员模板, 非虚拟成员函数,成员类或类模板的静态数据成员 不需要实例化。
如果您不致电g()
,则不需要实例化,因此调用myclass<0>{}.f()
时不会出现任何问题。
这同样可以保证您只使用std::vector
和{{{{{ 1}},分别。
后续,就像Jarod42 points out一样,显式实例化std::map
会产生断言,因为来自[temp.explicit] / 8:
命名类模板特化的显式实例化也是一个显式实例化 每个成员的同类(声明或定义)(不包括从基础继承的成员 以前没有明确专门用于翻译的类和模板成员 包含显式实例化的单元,除非如下所述。
此处不适用例外情况。
答案 1 :(得分:0)
使用模板专业化:
from bs4 import BeautifulSoup
import requests
urls = []
for i in range(1, 5):
offset = 36 * i
r = requests.get('http://www.barneys.com/barneys-new-york/men/clothing/shirts/dress/classic?start=1&format=page-element&sz={}&_=1434647715868'.format(offset))
soup = BeautifulSoup(r.text)
links = soup.find_all("a", {"class": "thumb-link"})
for link in links:
if len(urls) < 176:
print (link.get('href'))
urls.append(link.get('href'))
答案 2 :(得分:-1)
如果你想在编译时禁用一个函数,你应该使用enable_if而不是static_assert
template<unsigned int N>
struct Foo {
unsigned int f() {}
enable_if_t<(N > 0), unsigned int> g() {}
};
Foo<0> t{};
t.f(); /// this is okay and will compile
// t.g() if I uncomment this line, it will not compile anymore.